Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JNI可引用溢出:如何释放包含字符串的ObjectArray_Java_Android_C_Java Native Interface - Fatal编程技术网

Java JNI可引用溢出:如何释放包含字符串的ObjectArray

Java JNI可引用溢出:如何释放包含字符串的ObjectArray,java,android,c,java-native-interface,Java,Android,C,Java Native Interface,我在解决这个问题时感到很沮丧,而JNI文档非常稀少。非常感谢您的帮助 我在Android网络应用程序上分配了一个项目。本机端存储有关您连接到的用户的信息,我需要将此用户列表发送到Java端以更新UI信息。本质上,我需要组成一个字符串数组和一个布尔数组,其中包含连接用户的名称和标志,但稍后可能会发送更多信息。我的困难在于释放和清理包含字符串信息的对象数组。我不清楚怎么做。以下是我所拥有的: void name_list_cb(struct user_info* user_list, size_t

我在解决这个问题时感到很沮丧,而JNI文档非常稀少。非常感谢您的帮助

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

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);
}
void name\u list\u cb(结构用户信息*用户列表、大小计数、void*用户数据)
{
jobject回调=(jobject)userdata;
JNIEnv*env;
(*g_-vm)->GetEnv(g_-vm,(void**)和env,JNI_版本1_4);
jclass cls=(*env)->GetObjectClass(env,回调);
jmethodID method=(*env)->GetMethodID(env,cls,“用户列表”,“([Ljava/lang/String;[Z)V”);
int i;
jobjectArray名称\u列表;
jbooleanArray已连接\u列表;
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];
对于(i=0;iSetObjectArrayElement(env,名称列表,i,(*env)->NewStringUTF(env,用户列表[i].name));
布尔值\u arr[i]=用户\u列表[i]。已连接;
}
(*env)->SetBooleanArrayRegion(env,connected_list,0,count,(jboolean*)布尔_arr);
(*env)->CallVoidMethod(env、回调、方法、名称列表、连接列表);
(*env)->ReleaseBooleanArrayElements(env,connected_list,(jboolean*)boolean_arr,0);
对于(i=0;iReleaseStringUTFChars(env,(*env)->GetObjectArrayElement(env,name_list,i),user_list[i].name);
//(*env)->ReleaseObjectArrayElements(env,名称列表,计数,0);
}
(*env)->DeleteLocalRef(env,boolean_arr);
(*env)->DeleteLocalRef(env,名称列表);
(*env)->DeleteLocalRef(env,connected_列表);
(*env)->DeleteLocalRef(env,cls);
}
我得到了一个“可引用溢出”或“信号11(SIGSEGV),fault addr deadbaad”。溢出/内存泄漏是主要问题。基本上我没有释放UTFChars和对象元素。虽然我在网上看到了对它的引用,但我的JNI版本没有ReleaseObjectArrayElement[s].我一直在研究如何做到这一点,但到目前为止运气不好

typedef jarray          jobjectArray;   
void        (*DeleteLocalRef)(JNIEnv*, jobject);  
所以我认为使用DeleteLocalRef可以释放jobjectArray。 或者您可以在初始化方法中只新建一次jobjectArray。

我认为问题在于(*env)->DeleteLocalRef(env,boolean\u arr);因为boolean\u arr是C函数堆栈变量