我有我的JNI環境和jobject對象保存到現在爲止。我發現對於我的JNI來運行ICS和up設備,我需要修復我的JNI代碼。這是錯誤我得到:JNIEnv全局引用如何與C中的jobject不同?
02-20 10:20:59.523: E/dalvikvm(21629): JNI ERROR (app bug): attempt to use stale local reference 0x38100019
02-20 10:20:59.523: E/dalvikvm(21629): VM aborting
02-20 10:20:59.523: A/libc(21629): Fatal signal 11 (SIGSEGV) at 0xdeadd00d (code=1), thread 21629
我感到困惑如何創建/摧毀這些全局變量,如果我連這樣做的權利。
我的應用程序目前運行在使用該代碼的所有ICS預設備罰款:
BYTE Java_my_eti_commander_RelayAPIModel_00024NativeCalls_InitRelayJava(JNIEnv *env, jobject obj ) {
myEnv = (env);
myObject = obj;
changeID = (*myEnv)->GetStaticMethodID(myEnv, myObject, "changeItJavaWrapper", "(S)V" );
getID = (*myEnv)->GetStaticMethodID(myEnv, myObject, "getItJavaWrapper" , "(S)S" );
putID = (*myEnv)->GetStaticMethodID(myEnv, myObject, "putItJavaWrapper" , "(B)V");
flushID = (*myEnv)->GetStaticMethodID(myEnv, myObject, "flushItJavaWrapper" , "()V" );
delayID = (*myEnv)->GetStaticMethodID(myEnv, myObject, "delayItJavaWrapper" , "(S)V" );
RelayAPI_SetBaud= WrapSetBaud;
RelayAPI_get = WrapGetIt;
RelayAPI_put = WrapPutIt;
RelayAPI_flush = WrapFlushIt;
RelayAPI_delay = WrapDelayIt;
...
}
下GetStaticMethodID
來電,RelayAPI_變量是導致這裏所有的函數指針:
void WrapSetBaud(WORD w) {
return (*myEnv)->CallStaticVoidMethod(myEnv, myObject, changeID, w);
}
short WrapGetIt(WORD time) {
return (*myEnv)->CallStaticShortMethod(myEnv, myObject, getID, time);
}
void WrapPutIt(BYTE buff) {
return (*myEnv)->CallStaticVoidMethod(myEnv, myObject, putID, buff);
}
void WrapFlushIt(void) {
return (*myEnv)->CallStaticVoidMethod(myEnv, myObject, flushID);
}
void WrapDelayIt(WORD wait) {
return (*myEnv)->CallStaticVoidMethod(myEnv, myObject, delayID, wait);
}
最後,它返回到我的Java代碼在這裏:
public static void changeItJavaWrapper(short l) throws IOException {
mModelService.changeitJava(l);
}
public static void flushItJavaWrapper() {
mModelService.flushitJava();
}
public static void putItJavaWrapper(byte p) {
mModelService.putitJava(p);
}
public static void delayItJavaWrapper(short wait) {
mModelService.delayitJava(wait);
}
public static short getItJavaWrapper(short s) throws IOException {
return mModelService.getitJava(s);
}
我有改變了我的初始化到:
myEnv = (*env)->NewGlobalRef(env,obj);
myObject = (*env)->NewGlobalRef(env,obj);
但我是這個極其混亂,因爲它們具有相同的參數,它只是沒有任何意義。我無法找到這種方法的文檔,因爲這聽起來很愚蠢,this tutorial
,this page
和the oracle docs
沒有關於NewGlobalRef
方法本身的任何信息。
編輯
jmethodID changeID;
jmethodID getID;
jmethodID putID;
jmethodID flushID;
jmethodID delayID;
jobject myObject;
jclass bluetoothClass;
JNIEnv *myEnv;
非常感謝這個要求。你碰巧知道任何有關C的更多信息的好網站嗎? – JuiCe 2013-02-21 14:32:02
您正在尋找什麼信息? JNI?最佳實踐? – junix 2013-02-21 14:36:22
我仍然有點迷路,因爲我使用'GetStaticMethodID'而不是'GetFieldID'。對於我後來在代碼中調用的方法,我還必須具有全局保存的JNI Env,如我的第二個代碼塊所示。 - 我也不知道你的tUsb_Device變量是什麼,那個參數的數字與什麼比較? – JuiCe 2013-02-22 15:04:27