2012-01-03 22 views
3

この問題を解決するのに迷惑な時間を抱いています.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]を持っていません。私はこれを正確に行う方法を研究してきましたが、今まで運がありませんでした!

答えて

0
typedef jarray   jobjectArray; 
void  (*DeleteLocalRef)(JNIEnv*, jobject); 

私はdeleteLocalRefを使用してjobjectArrayを解放できると思います。 または、initializeメソッドでjobjectArrayを1回だけ新たに呼び出すことができます。

1

私は問題が(* env) - > DeleteLocalRef(env、boolean_arr)だと思います。 boolean_arrはCの関数スタック変数であるためです。

関連する問題