gpt4 book ai didi

java - JNI 引用表溢出 : how to release ObjectArray containing Strings

转载 作者:太空狗 更新时间:2023-10-29 14:28:59 26 4
gpt4 key购买 nike

我在解决这个问题时遇到了令人沮丧的时间,而且 JNI 文档少得可怜。将不胜感激!

我分配了一个关于 Android 网络应用程序的项目。 native 端存储有关您连接到的用户的信息,我需要将此用户列表发送到 Java 端以更新 UI 信息。本质上,我需要组成一个字符串数组和一个 boolean 数组,其中包含已连接用户的名称和标志,但稍后可能会发送更多信息。我的困难在于释放和清理包含字符串信息的对象数组。我不清楚该怎么做。这是我所拥有的:

void name_list_cb(struct user_info* user_list, size_t count, void *userdata)
{
jobject callbacks = (jobject)userdata;
JNIEnv *env;
(*g_vm)->GetEnv(g_vm, (void**)&env, JNI_VERSION_1_4);
jclass cls = (*env)->GetObjectClass(env, callbacks);
jmethodID method = (*env)->GetMethodID(env, cls, "user_list", "([Ljava/lang/String;[Z)V");

int i;
jobjectArray name_list;
jbooleanArray connected_list;

name_list = (jobjectArray)(*env)->NewObjectArray(env, count, (*env)->FindClass(env, "java/lang/String"), (*env)->NewStringUTF(env, ""));
connected_list = (jbooleanArray)(*env)->NewBooleanArray(env, count);
uint8_t boolean_arr[count];
for(i = 0; i < count; i++) {
(*env)->SetObjectArrayElement(env, name_list, i, (*env)->NewStringUTF(env, user_list[i].name));
boolean_arr[i] = user_list[i].connected;
}
(*env)->SetBooleanArrayRegion(env, connected_list, 0, count, (jboolean *)boolean_arr);

(*env)->CallVoidMethod(env, callbacks, method, name_list, connected_list);
(*env)->ReleaseBooleanArrayElements(env, connected_list, (jboolean *)boolean_arr, 0);

for(i = 0; i < count; i++) {
(*env)->ReleaseStringUTFChars(env, (*env)->GetObjectArrayElement(env, name_list, i), user_list[i].name);
//(*env)->ReleaseObjectArrayElements(env, name_list, count, 0);
}

(*env)->DeleteLocalRef(env, boolean_arr);
(*env)->DeleteLocalRef(env, name_list);
(*env)->DeleteLocalRef(env, connected_list);
(*env)->DeleteLocalRef(env, cls);
}

我收到“引用表溢出”或“信号 11 (SIGSEGV),故障地址死机”。溢出/内存泄漏是主要问题。基本上我不会发布 UTFChars 和 Object 元素。虽然我在网上看到过对它的引用,但我的 JNI 版本没有 ReleaseObjectArrayElement[s]。我一直在研究如何准确地做到这一点,但到目前为止运气不好!

最佳答案

我认为问题是 (*env)->DeleteLocalRef(env, boolean_arr);因为 boolean_arr 是 C 函数堆栈变量。

关于java - JNI 引用表溢出 : how to release ObjectArray containing Strings,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8720070/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com