この問題を解決するのに迷惑な時間を抱いています.JNIのドキュメントはひどく疎です。援助は大いに評価されるでしょう!JNI ReferenceTableオーバーフロー:Stringを含むObjectArrayを解放する方法
は、Androidネットワークアプリでプロジェクトを割り当てました。ネイティブサイドには、接続しているユーザーに関する情報が格納されています。UI情報を更新するには、このユーザーリストをJava側に送信する必要があります。基本的には、接続されたユーザーの名前とフラグを含む文字列配列とブール値配列を作成する必要がありますが、後でさらに情報が送信される可能性があります。私の問題は、&を解放して、文字列情報を含むオブジェクト配列を整理することです。私はこれを行う方法について明確ではない。ここで私が持っているものです。
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);
}
私は "referencetableオーバーフロー"、または "シグナル11(SIGSEGV)、障害のADDR deadbaad" のいずれかを取得します。オーバーフロー/ memleakは主な問題です。基本的に私はUTFCharsとObject要素を公開していません。私はそれをオンラインで参照していますが、私のJNIバージョンはReleaseObjectArrayElement [s]を持っていません。私はこれを正確に行う方法を研究してきましたが、今まで運がありませんでした!