java - 关于在 JNI 中分配的数组

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

我在 Android JNI 中编写了一个分配 Java 数组的函数。但是,如果从 Java 连续调用此函数,则会发生错误[*Fatal signal 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;
}

Java

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

我不应该使用这种方式吗?或者有什么措施?

最佳答案

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

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

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

env->DeleteGlobalRef(buffer);

关于java - 关于在 JNI 中分配的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13197965/

相关文章:

java - 如何使用 poi 库获取 Excel 文件中特定列的行数

java - 如何从 S3 到 S3 并行处理

android - 如何使用实验性 gradle 插件(NDK)在 android studio 中添加 openssl 库?

java - 对 Java 字符串使用 '==' 而不是 .equals

java - 从 Java 程序编译 scala 代码时出现异常

java.lang.NullPointerException 和未知来源

Android 小部件按钮停止工作

android - 从 App Engine 将图像数据发送到 Android 应用程序

android - 处理 JPEG 字节数组解码的更好选择

java - 无法解析相应的 JNI 函数 - jsqlite