V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
acros
V2EX  ›  问与答

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

  •  
  •   acros · 2014-03-21 21:23:43 +08:00 · 3438 次点击
    这是一个创建于 3924 天前的主题,其中的信息可能已经有所发展或是发生改变。
    因为项目牵扯到了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
    jptiancai
        1
    jptiancai  
       2014-09-03 22:50:54 +08:00
    不知道撸主解决该问题了莫有?
    本人没有做过相关的程序,不过给撸主几个建议:
    1.写一个单元测试,越简单也好,这样容易跟踪问题,比如测试blsCopy的值,testvalue_blsCopy()
    2.看一下oracle官方的jni文档,相信对你会有帮助.
    其实说出来说明你的思路已经很清晰,可以换个角度试试.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5446 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 08:45 · PVG 16:45 · LAX 00:45 · JFK 03:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.