关于native层用NewByteArray分配内存的问题

sno_guo 2013-06-06 11:54:21
大家好,我现在遇到一个问题,现象是这样的:
step1:
我在native层用 byteArray = (*env)->NewByteArray分配一个内存,然后把指针(命名为nativePtr)指向java层。里面有一些可以要使用的数据。
step2:
我再把 刚才传到java层的指针nativePtr 从java层再次传到native层, 再次对nativePtr进行操作 就出问题, 请问下这个是什么问题,谢谢。



还有, 我在native用 NewByteArray()分配内存后,java会自动回收吗,还是需要我自己回收,谢谢!
...全文
12492 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
vnking 2016-01-15
  • 打赏
  • 举报
回复
引用 10 楼 Jahan0211 的回复:
(*env)->ReleaseByteArrayElements (*env)->DeleteLocalRef 这样就可以清理了.
这两句代码应该写在什么位置?
janchin 2014-10-30
  • 打赏
  • 举报
回复
请问最后这个问题怎么解决的。关于set的时候出错哦~
魏消晨 2013-11-13
  • 打赏
  • 举报
回复
引用 11 楼 vampire_ljw 的回复:
[quote=引用 7 楼 sno_guo 的回复:] 哦,谢谢,感动啊,这么热情的帮助,谢谢啊。 还有一个不明白的是: 这个我用NewByteArray分配的内存,需要自己释放还是java会回收,如果要自己释放,我应该调用哪个函数,谢谢?
你好我用NewByteArray提示找不到这个函数啊,请问要加什么头文件吗?[/quote] --在jni接口的c或cpp文件中加上:#include <jni.h>
vampire_ljw 2013-09-14
  • 打赏
  • 举报
回复
引用 7 楼 sno_guo 的回复:
哦,谢谢,感动啊,这么热情的帮助,谢谢啊。 还有一个不明白的是: 这个我用NewByteArray分配的内存,需要自己释放还是java会回收,如果要自己释放,我应该调用哪个函数,谢谢?
你好我用NewByteArray提示找不到这个函数啊,请问要加什么头文件吗?
熊出没危险 2013-09-03
  • 打赏
  • 举报
回复
(*env)->ReleaseByteArrayElements (*env)->DeleteLocalRef 这样就可以清理了.
里沃特 2013-08-27
  • 打赏
  • 举报
回复
env->DeleteLocalRef
凉凉二点凉 2013-06-06
  • 打赏
  • 举报
回复
引用 7 楼 sno_guo 的回复:
哦,谢谢,感动啊,这么热情的帮助,谢谢啊。 还有一个不明白的是: 这个我用NewByteArray分配的内存,需要自己释放还是java会回收,如果要自己释放,我应该调用哪个函数,谢谢?
不用管
sno_guo 2013-06-06
  • 打赏
  • 举报
回复
哦,谢谢,感动啊,这么热情的帮助,谢谢啊。 还有一个不明白的是: 这个我用NewByteArray分配的内存,需要自己释放还是java会回收,如果要自己释放,我应该调用哪个函数,谢谢?
凉凉二点凉 2013-06-06
  • 打赏
  • 举报
回复
GetByteArrayRegion最后一个参数要是(jbyte *)类型的 参考以下:
char* Utility::getByteArrayValue(JNIEnv* env, jbyteArray byteArray, int* dataLength) {
    char* data = NULL;
    if (NULL != byteArray) {
        jint length = env->GetArrayLength(byteArray);

        *dataLength = length;
        if (0 < *dataLength) {
            data = new char[length];
            env->GetByteArrayRegion(byteArray, (jint)0, length, (jbyte *) data);
        }
    }
    return data;
}
PS:你的代码是C的,所以有 (*env)->.这个你别管,上面代码是C++的 我看了下区别就是GetByteArrayRegion的最后一个参数类型
sno_guo 2013-06-06
  • 打赏
  • 举报
回复
引用 4 楼 guoyoulei520 的回复:
[quote=引用 3 楼 sno_guo 的回复:] 哦,谢谢回复,我的意思是: native New一个buffer ====>>>传给java ====>>>再次传到 native ,这时操作的话,就出错。不清楚为什么? 回复:lieri111 既然不会回收,那么我通过什么函数来回收呢,我没有找到相关的函数啊????
你传给java的肯定是jbytearray 类型的不是指针 在次传到native的话是byte[] value类型的.native层接收并处理就行了.有什么问题吗? [/quote] 谢谢回复,请看下我的代码: jbyteArray Java_com_example_test_Getdata(JNIEnv *env, jobject thiz) { .................///一些其他获取数据的代码 byteArray = (*env)->NewByteArray(env, size); if (byteArray == NULL) { return NULL; } (*env)->SetByteArrayRegion(env, byteArray, 0, size,(jbyte *)data); return byteArray; } void Java_com_example_test_Setdata(JNIEnv *env, jobject thiz,jbyteArray jbuffer,jint size) { jbyteArray byteArray = NULL; jbyte data[size]; (*env)->GetByteArrayRegion(env,jbuffer, 0, size, data); ///<-----这里出问题,请教下为什么,谢谢!!! __android_log_print(ANDROID_LOG_INFO, "test", "test-----%.2x--%.2x--%.2x--%.2x--%.2x--%.2x--%.2x--", size, data[0], data[1], data[2], data[3], data[4], data[5], data[6]); return ; } 然后在java层调用的函数是: byte[] demoPtr=xxxx.Getdata(); 。。。。。。。。。。。//一些其他的操作 xxxx.Setdata(demoPtr,demosize); 这样 就在native的 setData()函数中出错了,请问下为什么,谢谢!
凉凉二点凉 2013-06-06
  • 打赏
  • 举报
回复
引用 3 楼 sno_guo 的回复:
哦,谢谢回复,我的意思是: native New一个buffer ====>>>传给java ====>>>再次传到 native ,这时操作的话,就出错。不清楚为什么? 回复:lieri111 既然不会回收,那么我通过什么函数来回收呢,我没有找到相关的函数啊????
你传给java的肯定是jbytearray 类型的不是指针 在次传到native的话是byte[] value类型的.native层接收并处理就行了.有什么问题吗?
sno_guo 2013-06-06
  • 打赏
  • 举报
回复
哦,谢谢回复,我的意思是: native New一个buffer ====>>>传给java ====>>>再次传到 native ,这时操作的话,就出错。不清楚为什么? 回复:lieri111 既然不会回收,那么我通过什么函数来回收呢,我没有找到相关的函数啊????
passself 2013-06-06
  • 打赏
  • 举报
回复
jni引用的java不会回收
凉凉二点凉 2013-06-06
  • 打赏
  • 举报
回复
没明白你的意思,你是不是想从jni返回一个byte数组?我直接从源码里弄了一个例子给你看看
private native byte[] onSaveInstanceStateNative(int handle);
static jbyteArray
onSaveInstanceState_native(JNIEnv* env, jobject clazz, jint handle)
{
    LOG_TRACE("onSaveInstanceState_native");

    jbyteArray array = NULL;

    if (handle != 0) {
        NativeCode* code = (NativeCode*)handle;
        if (code->callbacks.onSaveInstanceState != NULL) {
            size_t len = 0;
            jbyte* state = (jbyte*)code->callbacks.onSaveInstanceState(code, &len);
            if (len > 0) {
                array = env->NewByteArray(len);
                if (array != NULL) {
                    env->SetByteArrayRegion(array, 0, len, state);
                }
            }
            if (state != NULL) {
                free(state);
            }
        }
    }

    return array;
}

80,360

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧