这是一个创建于 3908 天前的主题,其中的信息可能已经有所发展或是发生改变。
因为项目牵扯到了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看得头昏脑胀,不知道问题本身有没有出漏洞。
谢过先~~~
1 条回复 • 2014-09-03 22:50:54 +08:00
|
|
1
jptiancai 2014-09-03 22:50:54 +08:00
不知道撸主解决该问题了莫有? 本人没有做过相关的程序,不过给撸主几个建议: 1.写一个单元测试,越简单也好,这样容易跟踪问题,比如测试blsCopy的值,testvalue_blsCopy() 2.看一下oracle官方的jni文档,相信对你会有帮助. 其实说出来说明你的思路已经很清晰,可以换个角度试试.
|