2011-11-10 28 views
1

我目前正在使用本地環境中的多線程工作。因此,我需要調用(* vm) - > GetEnv來接收本地線程的當前活動的JNIEnv。螺紋連接上創建,但我添加了一個故障轉移中調用getenv的方法:把你看透了(* vm) - >僅在HTC設備上使用GetEnv段錯誤

void get_jni_env(void **e) { 
    JNIEnv *env = malloc(sizeof(JNIEnv *)); 

    if((*vm)->GetEnv(vm, (void **)&env, JNI_VERSION_1_4) != JNI_OK) { 
     __android_log_write(ANDROID_LOG_ERROR, "Call to GetEnv from a unattached native thread. Trying to attach thread."); 
     if((*vm)->AttachCurrentThread(vm, &env, NULL) != JNI_OK) { 
      __android_log_write(ANDROID_LOG_ERROR, "Failed to receive any jni environment. Crashing soon"); 
     } 
    } 

    *e = env; 
} 

當踩在調用(* VM) - > GETENV段錯誤:

jni_get_long (ctx=0x40525080, key=0x804215e0 "hm") at jni/jni.c:50 
50  GET_JNI_ENV(&env); 
(gdb) s 
get_jni_env (e=0xbec603e8) at jni/../../../../core/android/util.c:159 
159  if((*vm)->GetEnv(vm, (void **)&env, JNI_VERSION_1_4) != JNI_OK) { 
(gdb) n 
156 void get_jni_env(void **e) { 
(gdb) 
157  JNIEnv *env = malloc(sizeof(JNIEnv *)); 
(gdb) 
159  if((*vm)->GetEnv(vm, (void **)&env, JNI_VERSION_1_4) != JNI_OK) { 
(gdb) 

Program received signal SIGSEGV, Segmentation fault. 
0xaca43510 in ??() ← this is somewhere on the heap 

相同的代碼在三星和索尼愛立信設備以及仿真器上工作得非常好。對於這個特定的錯誤,我有點不知道。我還測試了一款採用CyanogenMod 7.1的HTC設備,它應該與AOSP android非常相似,即使在同一點上它也會崩潰。

回答

1

無法理解,你爲什麼要分配你的JNIEnv變量? Android爲你做。總之,這裏是我的代碼,這對我的HTC Desire工作很大:

JNIEnv *GetJEnv() { 
    JNIEnv *res; 
    if (jvm->GetEnv((void **)&res,JNI_VERSION_1_6)==JNI_EDETACHED) 
    jvm->AttachCurrentThread(&res,NULL); 
    return res; 
} 
+0

那麼可以忽略。我嘗試瞭解它是否由堆棧中的某些錯誤地址引起,並將malloc()的地址移至堆中。但這個問題似乎在別的地方。你的版本也不行,我已經預先試過了。但是謝謝你花時間回答。 – lhw

0

JNIEnv *env = malloc(sizeof(JNIEnv *));

錯誤

它分配存儲器,可容納一個指針JNIEnv對象,而不是存儲量爲JNIEnv對象本身。

應該

JNIEnv *env = malloc(sizeof(JNIEnv)); 

甚至更​​好:

JNIEnv *env = malloc(sizeof(*env)); 

其他平臺上的 「工作完全正常」,並不意味着它是正確的。

相關問題