因为项目牵扯到了Android平台,这几天硬着头皮开始琢磨Android的NDK,目前正在啃JNI。这方面我一点都没接触过,小组里面竟然也没人有经验,瀑布汗····
现在有个关于内存释放的困惑,直接上来问了先。
以下流程是要Java端获取一些数据,然后在C++端转化成BYTE*处理:
先在Java里面new了一个类,这个类包含一个byte型数组成员,填充好数组数据。
按JNI的方法,C++端可以取到jbyteArray类型的成员。
接着,从jbyteArray处获取jbyte*。
1: jbyte* arrayBody = env->GetByteArrayElements( byteArray ,bIsCopy);
按JNI的说法,这里bIsCpoy = true,arrayBody的内容是从jbyteArray里面做了一个副本出来。
然后将类型强转成C++的BYTE*,获取完毕:
2: BYTE * buffer= (BYTE*)arrayBody;
最后调用ReleaseByteArrayElements释放数组内存:
3: env->ReleaseByteArrayElements(jbyteArray, arrayBody , JNI_ABORT);
以上都是正常的。
疑问入下:
(一)把(1)处bIsCopy设置为false时,Eclipse里面debug就看见(2)处类型强制转换结果是0,这是咋回事啊···
(二)java里面new的那个类,其生命周期是怎么样的?GetByteArrayElements在bIsCopy=false模式下,获取到的数组指针指向的是Java端堆上的那部分原始内存吗?那这个类是在调用ReleaseByteArrayElements(JNI_ABORT)后才被Java销毁?
······················
以上。今天看JNI看得头昏脑胀,不知道问题本身有没有出漏洞。
谢过先~~~
现在有个关于内存释放的困惑,直接上来问了先。
以下流程是要Java端获取一些数据,然后在C++端转化成BYTE*处理:
先在Java里面new了一个类,这个类包含一个byte型数组成员,填充好数组数据。
按JNI的方法,C++端可以取到jbyteArray类型的成员。
接着,从jbyteArray处获取jbyte*。
1: jbyte* arrayBody = env->GetByteArrayElements( byteArray ,bIsCopy);
按JNI的说法,这里bIsCpoy = true,arrayBody的内容是从jbyteArray里面做了一个副本出来。
然后将类型强转成C++的BYTE*,获取完毕:
2: BYTE * buffer= (BYTE*)arrayBody;
最后调用ReleaseByteArrayElements释放数组内存:
3: env->ReleaseByteArrayElements(jbyteArray, arrayBody , JNI_ABORT);
以上都是正常的。
疑问入下:
(一)把(1)处bIsCopy设置为false时,Eclipse里面debug就看见(2)处类型强制转换结果是0,这是咋回事啊···
(二)java里面new的那个类,其生命周期是怎么样的?GetByteArrayElements在bIsCopy=false模式下,获取到的数组指针指向的是Java端堆上的那部分原始内存吗?那这个类是在调用ReleaseByteArrayElements(JNI_ABORT)后才被Java销毁?
······················
以上。今天看JNI看得头昏脑胀,不知道问题本身有没有出漏洞。
谢过先~~~