我正在使用JNI Invocation API,從C中調用Java。我有一些預先初始化來將30多個Java類緩存到全局引用中。 FindClass的結果被傳入NewGlobalRef以獲取對該類的全局引用。我正在緩存這些類變量以便稍後重用它們。我有30多個類的全局引用(和類構造函數的30多個全局方法ID)。JNI緩存的jclass全局引用變量是否被垃圾收集?
在下面的示例中,爲了縮短代碼段,我已經除去了異常處理以及JNI調用。我的工作代碼在每次JNI調用後都有異常檢查,並且正在使用-Xcheck:jni運行。這裏的片段:
jclass aClass;
jclass bClass;
jmethodID aCtor;
jmethodID bCtor;
void getGlobalRef(const char* clazz, jclass* globalClass)
{
jclass local = (*jenv)->FindClass(jenv,clazz);
if (local)
{
*globalClass = (jclass) (*jenv)->NewGlobalRef(jenv,local);
(*jenv)->DeleteLocalRef(jenv,local);
}
}
methodID getMethodID(jclass clazz, const char* method, const char* sig)
{
return (*jenv)->GetMethodID(jenv,clazz,method,sig);
}
void initializeJNI()
{
getGlobalRef("MyProj/Testclass1", &aclass);
getGlobalRef("MyProj/Testclass2", &bclass);
.
.
aCtor = getMethodID(aclass,"<init>","()V");
bCtor = getMethodID(bclass,"<init>","(I)V");
}
的initializeJNI()函數爲jclasses和方法ID的全局引用的構造以及一些jfieldID的和C的數據結構的一些初始化。
初始化後,當我使用某些緩存的jclasses和ctor jmethodID調用JNI函數時,我得到一個來自-Xcheck:jni的糟糕的全局或本地引用調用。
在gdb中,我在initializeJNI()的最後一行中斷,並打印所有的jclasses和jmethodIDs,而導致問題的那些看起來已經變成垃圾或垃圾收集(即0x00或0x06)。全局引用可能被gc化了嗎?
有什麼建議嗎?
已解決。數據損壞C.沒有JNI錯誤。 – bubbadoughball 2010-04-08 04:44:47