求助。关于 JNI 数组传递中内存的问题···可能比较初级。

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

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/105329

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX