在Java中数组分为两种:

1.基本类型数组

2.对象类型(Object[])的数组(数组中存放的是指向Java对象中的引用)

一个能通用于两种不同类型数组的函数:

GetArrayLength(jarray array);

首先来看一下怎么处理基本类型的数组:

(1) GetArrayElements(Array arr , jboolean* isCopide);

这类函数可以把Java基本类型的数组转换到C/C++中的数组,有两种处理方式,一种是拷贝一份传回本地代码,另一个是把指向Java数组的指针直接传回到本地代码中,处理完本地化的数组后,通过ReleaseArrayElements来释放数组

(2) ReleaseArrayElements(Array arr , * array , jint mode)

用这个函数可以选择将如何处理Java跟C++的数组,是提交,还是撤销等,内存释放还是不释放等

mode可以取下面的值:

0 :对Java的数组进行更新并释放C/C++的数组

JNI_COMMIT :对Java的数组进行更新但是不释放C/C++的数组

JNI_ABORT:对Java的数组不进行更新,释放C/C++的数组

(3) GetPrimittiveArrayCritical(jarray arr , jboolean* isCopied);

(4) ReleasePrimitiveArrayCritical(jarray arr , void* array , jint mode);

也是JDK1.2出来的,为了增加直接传回指向Java数组的指针而加入的函数,同样的也会有同GetStringCritical的死锁的问题

(5) GetArrayRegion(Array arr , jsize start , jsize len , * buffer);

在C/C++预先开辟一段内存,然后把Java基本类型的数组拷贝到这段内存中,这个方法和之前拷贝字符串的GetStringRegion方法的原理是类似的

(6) SetArrayRegion(Array arr , jsize start , jsize len , const * buffer);

把Java基本类型的数组中的指定范围的元素用C/C++的数组中的元素来赋值

(7) Array NewArray(jsize sz)

指定一个长度然后返回相应的Java基本类型的数组

在来看一下怎么处理对象型数组

JNI没有提供直接把Java的对象类型数组(Object[])直接转到C++中的Object[]数组的函数,而是直接通过Get/SetObjectArrayElement这样的函数来对Java的Object[]数组进行操作由于去的对象数组没有进行拷贝,所以不需要释放任何资源

NewObjectArray可以通过指定长度跟初始值来创建某个类的数组

下面来看一下例子:操作两种类型的数组

Java中的代码:

7.jpg (26.45 KB, 下载次数: 13)

2016-11-24 17:48 上传

C++中的代码:

9.jpg (47.25 KB, 下载次数: 13)

2016-11-24 17:51 上传

10.jpg (54.16 KB, 下载次数: 12)

2016-11-24 17:51 上传

15.jpg (77.75 KB, 下载次数: 10)

2016-11-24 17:51 上传

在Eclipse编译运行结果如下:

16.jpg (20.51 KB, 下载次数: 9)

2016-11-24 17:52 上传

c++ java setobjectarrayelement_java中jni的使用:C/C++操作java中的数组相关推荐

  1. jni c运行java字符串,通过JNI将C ++字符串发送到Java

    我正在构建Android应用程序的项目的C 方面.我需要一些信息(通过字符串和字符串数组)传递给Java应用程序(通过JNI).我以前从未做过,相反方向的人没有C的经验,并承认他们不能真正提供帮助. ...

  2. 【Windows 逆向】OD 调试器工具 ( CE 中获取子弹动态地址前置操作 | OD 中调试指定地址的数据 )

    文章目录 一.CE 中获取子弹动态地址前置操作 二.OD 中调试子弹数据 一.CE 中获取子弹动态地址前置操作 在上一篇博客 [Windows 逆向]OD 调试器工具 ( CE 工具通过查找访问的方式 ...

  3. android中JNI知识(很全)

    Chap1:JNI完全手册 最近在公司里做了一个手机的项目,需要JAVA程序在发送短信的时候和第三方的短信服务器连接.短信接口是用C++写的.琢磨了三天,大致搞懂了JNI的主体部分.先将心得整理,希望 ...

  4. Java如何利用JNI调用C++(简略介绍及步骤)

    Java如何利用JNI调用C++(简略介绍及步骤) 文章目录 Java如何利用JNI调用C++(简略介绍及步骤) 一.原理介绍 二.详细步骤 步骤一:编写Java类 步骤二:生成.h文件 步骤三:CL ...

  5. 【JavaScript】在JavaScript中使用JSON进行序列化/反序列化操作

    文章目录 用于stringfy/parse操作的"JSON"对象 JavaScript中简单数据类型的JSON序列化操作 使用toJSON()进行对象的序列化操作 使用eval() ...

  6. python各种文件_Python中对 文件 的各种骚操作

    Python中对 文件 的各种骚操作 python中对文件.文件夹(文件操作函数)的操作需要涉及到os模块和shutil模块. 得到当前工作目录,即当前Python脚本工作的目录路径: os.getc ...

  7. Idea中git进行回滚版本操作和查看修改记录

    Idea中git进行回滚版本操作 开发过程中:在进行代码提交后,总会出现一些错误和没有完善的地方,需要进行回滚修改,搜索后还是有多种方法的,自己记录一下用的比较多的方式吧: 1.项目右键后,然后在&q ...

  8. golang中连接mongo数据库并进行操作

    golang中连接mongo数据库并进行操作 golang中连接mongo数据库并进行操作 首先,我们需要下载mongo模块 执行 go get github.com/mongodb/mongo-go ...

  9. jni jvm 内存泄漏_解析Java的JNI编程中的对象引用与内存泄漏问题

    JNI,Java Native Interface,是 native code 的编程接口.JNI 使 Java 代码程序可以与 native code 交互--在 Java 程序中调用 native ...

最新文章

  1. 多版本python共存,安装三方库到指定python版本 多Python版本和虚拟环境
  2. EM: 生而为菌,自强不息-嗜酸杆菌在重金属污染土壤中的生态适应性机制
  3. Windows内核新手上路2——挂钩shadow SSDT
  4. SpringMVC+Spring3.2+Hibernate4整合实例
  5. 计算机视觉论文-2021-05-31
  6. MTK驱动(77)---Android getevent用法
  7. Angr安装与使用之安装篇
  8. Visual Studio2012 安装教程
  9. 使用代理服务器哪些风险?
  10. 互联网行业的那些缩写PM,RD,FE,UE,QA,OP,BRD,MRD,PRD,FSD
  11. vue+css实现选择框内打勾效果
  12. 18 获取给定的序列的所有排列, 组合
  13. Excel批量选中表格中所有图片
  14. payjs 源码_第三方支付平台源码,仿支付宝
  15. javascript基础学习 1
  16. 深入理解设计模式-责任链模式(职责链模式)
  17. linux centos7增加文件夹权限,在Centos7系统中实现用户和文件权限的管理
  18. 免费在线!!!多PDF合成一个PDF
  19. vr全景技术开启智能化vr酒店宣传新模式
  20. 碉堡了: 兜宝让iPhone双卡双待成为现实

热门文章

  1. 取消ajax请求时页面闪烁,用Ajax+js+jQuery实现无闪烁定时刷新页面
  2. 分布式事务框架-TX-LCN
  3. tomcat的localhost_access_log日志文件
  4. Spring Cloud 负载均衡
  5. mysql的局限_Mysql数据分区局限性大总结
  6. android自动运行服务,Android开机自启动服务的实现方法
  7. 电脑护眼模式_2020年双11护眼仪/眼部按摩仪推荐 |护眼仪/眼部按摩仪选购指南 |高性价比护眼仪推荐...
  8. 获取当前日期是本年的第几周java与mysql获取值不一致
  9. Oracle用户密码使用特殊符号,例如(AND)、$(Dollar)、#(Pound)、*(Star)等
  10. mysql function select 赋值_数据分析面试之mysql的分组排序和变量赋值顺序