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

在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中的代码:

12713cad1677138c65cc7c5cec61bf1b.gif

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

2016-11-24 17:48 上传

C++中的代码:

12713cad1677138c65cc7c5cec61bf1b.gif

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

2016-11-24 17:51 上传

12713cad1677138c65cc7c5cec61bf1b.gif

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

2016-11-24 17:51 上传

12713cad1677138c65cc7c5cec61bf1b.gif

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

2016-11-24 17:51 上传

在Eclipse编译运行结果如下:

12713cad1677138c65cc7c5cec61bf1b.gif

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

2016-11-24 17:52 上传

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值