JNI中的回调函数,C++中的vector数组和Java中int数组的转换

2023-11-03

简介:

使用JNI的过程中,在Java端使用C++程序中的回调函数,对程序来说很方便,最近在做图形识别的过程中遇到了数组的转换方面的问题,后来仔细想了一下,在网上简单看了点资料,发现在JNI层对vector数组转换,最后在回调中返回到Java端int数组很有规律,不多说,上代码。

//一维数

int callbackMethod(int num,vector<int> vArray)
{
    int ret = 0;
    int needsDetach;
    JNIEnv *env = getJNIEnv(&needsDetach);
    jintArray jArray = env->NewIntArray(num);
    jint *jnum = new jint[num];
    for(int i = 0; i < num; ++i)
    {
        *(jnum + i) = vArray[i];
    }
    env->SetIntArrayRegion(jArray, 0, num, jnum);

//现在得到了我们要的jArray,也就是回调函数中返回到Java端的int数组,回调中的参数为(int a,int[] b);JNI中的类型为"I[I" env->CallVoidMethod(mobj, mid, num,jArray);

    jthrowable exception = env->ExceptionOccurred();
    if (exception)
    {
        env->ExceptionDescribe();
        ret = -1;
    }
    delete[] jnum;
    return ret;
}


//二维数组

int callbackMethod(int num, vector<vector<int> > vArray)
{
    int ret = 0;
    int needsDetach;
    JNIEnv *env = getJNIEnv(&needsDetach);
    jobjectArray jOArray;
    jclass intArrCls = env->FindClass("[I");
    jOArray = env->NewObjectArray(num, intArrCls, 0);
	//二维数组长度为2,循环赋值
    for (int i = 0; i < num; i++)
    {
        jint tmp[2];
        jintArray jiarr = env->NewIntArray(2);
        for(int j = 0; j < 2; j++) {
            tmp[j] = vArray[i][j];
        }
        env->SetIntArrayRegion(jiarr, 0, 2, tmp);
        env->SetObjectArrayElement(jOArray, i, jiarr);
          env->DeleteLocalRef(jiarr);
    }
	//回调中的参数为(int a,int[] b);JNI中的类型为"I[[I"
    env->CallVoidMethod(mobj, mid, num, jOArray);
    jthrowable exception = env->ExceptionOccurred();
    if (exception)
    {
        env->ExceptionDescribe();
        ret = -1;
    }
    return ret;
}
	三维数组之类的同理,加一层for循环赋值即可。


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JNI中的回调函数,C++中的vector数组和Java中int数组的转换 的相关文章

  • 为什么大多数 Android 设备不像典型操作系统那样有交换区域?

    现在有 Android 支持交换区域来提高性能吗 出于哪些考虑 大多数 Android 设备放弃了该功能 现在有 Android 支持交换区域吗 Quoting 黛安 哈克伯恩 https groups google com d msg a
  • 如何使用android ndk r9b为Android编译FFMPEG

    我想设计一个Android应用程序 可以通过FFMPEG命令播放和编辑视频 但我不知道如何在Android上使用FFMPEG 我尝试过从Google搜索到的许多方法 但它们太旧了 无法实现 现在 FFMPEG的最新版本是2 1 1 Andr
  • 迭代 Sqlite-query 中的行

    我有一个表布局 我想用数据库查询的结果填充它 我使用全选 查询返回四行数据 我使用此代码来填充表行内的 TextView Cursor c null c dh getAlternative2 startManagingCursor c th
  • 自动检测log4j静态初始化错误的方法

    请注意 这更像是 Bash 问题 而不是 Java 问题 请参阅下面的注释 在每个类中配置log4j时 我们执行以下操作 public class Example private static final Logger log Logger
  • 测试 Hessian remoting-servlet.xml

    我们使用 Hessian 来实现富客户端和服务器之间的通信 由于移动和重命名 remoting servlet xml 中的条目有时会与实际的类名不匹配 因此 我正在寻找一种简单的方法来测试远程处理 xml 有没有简单的方法可以做到这一点
  • 如何自定义 JFrame 上的标题栏?

    我想在我的 Java Swing 桌面应用程序中拥有一个自定义的标题栏 最好的方法是什么 我可以通过在 JFrame 的构造函数中使用以下代码来使用 Swing 标题栏 this setUndecorated true this getRo
  • Android 改造参数化@Headers

    我正在使用 OAuth 每次发出请求时都需要将 OAuth 令牌放入标头中 我看到 Header注释 但是有没有办法让它参数化 以便我可以在运行时传入 这是概念 Header Authorization OAuth var api vers
  • 改变换行行为

    我可以在 TextView 中使用 Spannable 创建具有不同外观 下划线 删除线等的跨度 我怎样才能做同样的事情来改变换行行为 特别是 我不希望电子邮件地址在中间换行 我希望它像一个单词一样 I tried 包裹在一起跨度 http
  • 如何在打开导航抽屉时使背景 Activity 变小?

    我想做我的背景Activity打开时稍微小一点Navigation Drawer 模拟存在的效果Airbnb应用 我想最好的解释是截图 但重点不是让 View 变小 而是让它成为与 Drawer 打开 关闭动画同步的动画 因此 如果您开始打
  • 将 try catch finally 块放入另一个 finally 块中

    try catch finally try catch finally 上面的代码好不好 是的 你可以这样做 实际上 在处理想要正确关闭的流时 您甚至需要这样做 InputStream in try catch finally try in
  • Android:如何停止监听电话监听器? [复制]

    这个问题在这里已经有答案了 可能的重复 Android 为什么 PhoneCallListener 在活动完成后仍然存在 https stackoverflow com questions 11666853 android why phon
  • Guava MultiSet 与 Map?

    我对Multiset的理解是一个带有频率的集合 但是我总是可以使用Map来表示频率 还有其他原因使用Multiset吗 优点Multiset
  • 如何将模型从 ML Pipeline 保存到 S3 或 HDFS?

    我正在尝试保存 ML Pipeline 生成的数千个模型 正如答案中所示here https stackoverflow com questions 32121046 run 3000 random forest models by gro
  • 以编程方式安装 Android apk 作为测试框架的一部分

    我正在尝试以编程方式安装 apk 但运气不佳 我正在设置一个针对物理设备的自动化测试框架 并且我希望测试设备在运行测试之前从构建服务器检索最新的 apk 虽然我知道没有通用的方法可以在未经用户同意的情况下实际安装 apk 但我很好奇在开发人
  • 如何从 SD 卡中删除文件

    我正在创建一个文件作为电子邮件的附件发送 现在我想在发送电子邮件后删除图像 有没有办法删除文件 我努力了myFile delete 但它没有删除该文件 我在 Android 上使用此代码 因此编程语言是 Java 使用通常的 Android
  • AAR 可以包含传递依赖吗? [复制]

    这个问题在这里已经有答案了 现在我有一个库项目 比如项目 Foo 它依赖于像 OkHttp 这样的库 现在 Foo 有一个 Maven 构建步骤 可以生成 AAR 并将其推送到公共位置 现在假设我有项目 B 我们将其称为 Bar Bar是一
  • 如何在给定的纬度和经度处使用标记/覆盖项目启动地图意图?

    我有一个纬度和经度 我想打开以该点为中心的谷歌地图 所以我使用以下代码 Intent intent new Intent android content Intent ACTION VIEW Uri parse geo lat lng st
  • 无法查询 ContentResolver 以从 my_downloads 获取下载文件的名称,但在 all_downloads 中工作正常

    我的应用程序设置为激活一次具有扩展名的文件 myappdata被打开 它通过这个意图过滤器来实现这一点
  • 使用 Arduino 来操作 Android [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 有人尝试过让 Android 和 Arduino 相互通信吗 我在网上找到了几个项目 Amarino http www amarino tool
  • Java:将秒转换为分钟、小时和天[重复]

    这个问题在这里已经有答案了 任务是 输出应如下所示 最好回显输入 您输入了 500 000 秒 即 5 天 18 小时 53 分钟 20 秒 5天18 53 20小时 我该怎么做呢 最容易理解和做到的方法是什么 讲师还说 没有硬编码 我不太

随机推荐

  • 基于MegEngine实现语义分割【附部分源码及模型】

    文章目录 前言 语义分割发展史及意义 一 数据集的准备 二 基于MegEngine的语义分割框架构建 1 引入库 2 CPU GPU配置 3 数据标准化 4 解析数据集到列表中 5 设置数据迭代器 6 获取loader 7 模型构建 8 模
  • 从源代码编译安装 Mono 2.4 和 MonoDevelop 2.0

    从源代码编译安装 Mono 2 4 和 MonoDevelop 2 0 虽然现在几乎所有的Linux发行版都预置了Mono软件 但是大多数都比较旧 因此要体验最新版本的Mono 还是要用源代码自己进行编译安装的 先说几句废话 Mono 2
  • F12打断电调试

    举例 比如一个系统查询信息 点击 查询 显示需要 工号为纯数字 此刻需要F12开发者工具调试 第一步 按下键盘F12 找到Sources 对应的代码 打断点 第二步 在页面右键单击 重新加载框架 此刻会在打断点的地方停止 点击Console
  • [已解决]ln: failed to create symbolic link ‘/usr/bin/python’: File exists

    安装python3 在添加软链时报错如下 翻译过来的意思就是 创建符号链接失败 文件存在 root VM 12 15 centos Python 3 7 6 ln s usr local python3 bin python3 7 usr
  • git学习记录3-----分支操作

    git学习记录3 分支操作 从master分支创建feature A 分支和 fix B 分支 查看分支 创建 切换分支 培育分支实操 首先在READEME md进行修改 切换回master分支 切换回上一个分支 特性分支 主干分支 分支合
  • 判断子序列(C语言)

    判断子序列 思路简单 所用知识比较基础 题目 给定字符串 s 和 t 判断 s 是否为 t 的子序列 字符串的一个子序列是原始字符串删除一些 也可以不删除 字符而不改变剩余字符相对位置形成的新字符串 例如 ace 是 abcde 的一个子序
  • 【OpenCV图像处理】1.18 拉普拉斯算子 - Laplance算子

    文章目录 1 相关理论 2 代码 运行效果 1 相关理论 在上一节已经提到过 f t f t f t 的一阶导就是 f
  • Makefile语法详细总结及示例解析(快速掌握)

    文章目录 一 简介 二 常用规则介绍 2 1 递归扩展变量 2 2 常见的自动化变量解析 2 3 常用的编译器宏定义 2 4 条件语法 2 5 其他特殊变量 1 VPATH变量 2 PHONY变量 3 include变量 4 Q 变量 2
  • 一定要看的VS code安装keil插件的常见问题

    前几天安装了VS code 想在里面写单片机程序 碰到了很多人都会问的问题 看了网络上好多文章都没有解决 后来问了一个学长 才终于解决 一 打开keil工程出现波浪线 出现红色波浪线的主要原因是 没有找到路径 学长说的是 没有包标准C库的两
  • C语言程序设计教程习题和答案-C语言期末复习必看资料

    C语言期末复习必看资料 喜欢的点个赞再走呗 万分感谢
  • 如何用Stata完成(shui)一篇经济学论文(十二):描述性统计、回归与结果保存

    文章目录 描述性统计 回归命令 结果保存 描述性统计 描述性统计的命令我一般使用summerize 用法为summerize加上你所想要总结的变量名称 如果summerize后什么都不加 则表示描述所有变量 sysuse auto 表示描述
  • Linux网络编程:网络基础

    文章目录 一 协议 二 网络应用设计模式 BS模式和CS模式 三 网络分层模型 OSI七层 TCP IP四层 四 通信过程 五 协议格式 1 数据包封装 2 以太网帧格式和ARP数据报格式 3 IP段格式 4 UDP数据报格式 5 TCP数
  • 5.ARP协议

    1 前言 当网络设备需要有数据要发送给另一台网络设备时 必须要知道对方的网络层地址 即IP地址 IP地址由网络层来提供 但是仅有IP地址是不够的 IP数据报文必须封装成帧才能通过数据链进行发送 数据帧必须要包含目的MAC地址 因此发送端还必
  • 如何通过C#读取PI实时数据

    今天来说说PI实时数据库 PI 实时数据库系统 Plant Information System 在自动化行业的应用 可以说是最广泛的 美国 OSI Software 公司开发 这个玩意确实很强大 某化工企业20多万点轻松搞定 读取数据一次
  • Storcli tool 简单用法

    storcli64 c0 show all storcli64 cx eall sall show 显示物理磁盘信息 storcli64 cx ex sx set good offline online missing 设置某块磁盘的状态
  • c 服务器部署网站跟数据库连接,如何用c语言连接数据库服务器

    如何用c语言连接数据库服务器 内容精选 换一换 华为云帮助中心 为用户提供产品简介 价格说明 购买指南 用户指南 API参考 最佳实践 常见问题 视频帮助等技术文档 帮助您快速上手使用华为云服务 华为云帮助中心 为用户提供产品简介 价格说明
  • C#写的控制三菱FX5U PLC(三菱任何系列都通用,网口,串口都行)的上位机程序

    自己用C 写的控制三菱FX5U PLC 三菱任何系列都通用 网口 串口都行 的上位机程序 PLC源程序也附上 是学习C 和三菱PLC通信的好例子 有对辅助继电器M 对单字 双子D的读写 IO的监控 报警的显示等功能 亲测可用 C 运动控制
  • 机器学习——numpy基础使用教程

    这里写目录标题 TOC 这里写目录标题 前言 numpy array基础使用操作 1 数组创建 2 数据访问 3 数组合并 4 数组的分割 5 简单运算 6 矩阵的聚合操作 7 矩阵的索引和比较 前言 当我们在处理数据的时候 我们经常会使用
  • 第二天学习

    bug maker队 云殇 第二天打卡 学习内容 运算符 CSDN社区 总结 运算符中比较难理解的就是 和 如果字母在前面 则表达式的值为变量的值 如果字母在后面 则表达式的值为字变量运算后的值 题目 一个整数 它加上100后是一个完全平方
  • JNI中的回调函数,C++中的vector数组和Java中int数组的转换

    简介 使用JNI的过程中 在Java端使用C 程序中的回调函数 对程序来说很方便 最近在做图形识别的过程中遇到了数组的转换方面的问题 后来仔细想了一下 在网上简单看了点资料 发现在JNI层对vector数组转换 最后在回调中返回到Java端