2010-04-07 56 views
2

我正在使用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化了嗎?

有什麼建議嗎?

+0

已解決。數據損壞C.沒有JNI錯誤。 – bubbadoughball 2010-04-08 04:44:47

回答

3

糟糕!

已解決。 C中的數據損壞跺腳導致一些內存導致我緩存的JNI變量丟失。

沒有JNI錯誤。

+0

我有很多問題,我認爲這是一個JNI問題,事實證明,只是在C/C++代碼(使用釋放變量,覆蓋緩衝區等)的一些不良內存管理,這是跺腳在JNI參考! – 2012-12-11 17:14:43