关于在JNI中分配的数组

时间:2012-11-02 15:10:54

标签: java android android-ndk java-native-interface

我写了一个在Android JNI中分配Java数组的函数。但是,如果从Java连续调用此函数,则会发生错误[*致命信号11(SIGSEGV)]。

C ++

static jbyteArray buffer = NULL;
static int cbuflen = 0;
jbyteArray Java_com_sample_buffer_Buffer_updateBuffer(JNIEnv* env, jobject thiz, jlong handle, jint buflen)
{
    if(buflen > cbuflen){
        if(buffer != NULL) env->DeleteLocalRef(buffer);
        buffer = env->NewByteArray(buflen);
        cbuflen = buflen;
    }
    return buffer;
}

爪哇

byte[] buf = conv.updateBuffer(buflen);

我不应该用这种方式吗?还是有一些措施?

1 个答案:

答案 0 :(得分:4)

如果你想在JNI调用之间保留jobject(比如jbyteArray),你需要将它设为GlobalRef:

jbyteArray temp_buffer = env->NewByteArray(buflen);
buffer = (jbyteArray)env->NewGlobalRef(temp_buffer);

然后才记得删除对象以释放内存:

env->DeleteGlobalRef(buffer);