我的應用程序運行下面的代碼:JNI。不同的Android操作系統版本之間的不同的行爲
void BmrDeviceInfo_convertToC(JNIEnv *pEnv, jobject jBmrDeviceInfo, BmrDeviceInfo& cBmrDeviceInfo){
__android_log_print(ANDROID_LOG_INFO, "BEAMER_JNI", "g_classBmrDeviceInfo is = %s", (g_classBmrDeviceInfo == NULL) ? "NULL" : "OK"); //g_classBmrDeviceInfo is initialize on JNI_OnLoad
jfieldID fieldName = pEnv->GetFieldID(g_classBmrDeviceInfo, "m_strName", "Ljava/lang/String;"); // OK for Android 4.2 and crash for Android 3.1 or less
..................................
}
而且logcat的輸出崩潰的情況:
04-17 16:28:44.118: I/BEAMER_JNI(446): g_classBmrDeviceInfo is = OK
04-17 16:28:44.118: W/dalvikvm(446): JNI WARNING: 0x4053dc70 is not a valid JNI reference
04-17 16:28:44.118: W/dalvikvm(446): in Lcom/xxxxxxx/xxxxxx/controller/CoreController;.Init (Lcom/xxxxxxx/xxxxxx/listviews/DeviceInfo;Ljava/lang/String;)I (GetFieldID)
04-17 16:28:44.118: I/dalvikvm(446): "main" prio=5 tid=1 RUNNABLE
04-17 16:28:44.118: I/dalvikvm(446): | group="main" sCount=0 dsCount=0 obj=0x4001f1a8 self=0xce48
04-17 16:28:44.118: I/dalvikvm(446): | sysTid=446 nice=0 sched=0/0 cgrp=default handle=-1345006528
04-17 16:28:44.118: I/dalvikvm(446): | schedstat=(276745040 468907344 84)
感謝您的幫助!
檢查這個http://stackoverflow.com/questions/11907832/jni-local-vs-global-reference-is-not-a-valid-jni-reference – Pragnani
看起來像很多改變4 1實現類改變從c https://android.googlesource.com/platform/dalvik/+/gingerbread/vm/Jni.c到C++ https://android.googlesource.com/platform/dalvik/+/master/vm/Jni.cpp而且還有很多更改。看起來最早的版本是4.1.1左右。這可能有點解釋你的問題。現在我不是一個很棒的C人,所以你可以看看它,你可以看到它的差異。沒有任何東西出現在我身上。 – Jackie