2013-06-20 66 views
2

我正在使用枚舉模式在我的應用程序中定義單例。我需要訪問這個單例的方法,但我似乎無法正確傳遞單例。如何通過JNI將Java枚舉暴露給本機代碼

我試圖通過枚舉和創建jobject作爲globalRef,它像這樣:

class FrameElapsedListener : public gkEngine::Listener{ 
public: 
JNIEnv* env; 
jobject entityManager; 

FrameElapsedListener(JNIEnv* env, jobject entityManager) : 
    env(env), 
    entityManager(env->NewGlobalRef(entityManager)){} 
~FrameElapsedListener(){ 
    env->DeleteGlobalRef(entityManager); 
} 
void tick(gkScalar rate); 
}; 

,但我用它當「本地裁判」出局的範圍,想有一個崩潰這樣的:

jclass entityManagerClass = env->FindClass(entityManagerClassPath.c_str()); 
jmethodID entityManagerFrameElapsedMethodId = env->GetMethodID(entityManagerClass, "frameElapsed", "(F)V"); 
env->CallVoidMethod(entityManager, entityManagerFrameElapsedMethodId, rate); //crashes here 

現在我想剛剛得到的單出枚舉,但我不知道如何抓住這樣的枚舉值。有什麼建議?

+1

某些錯誤一般會幫助檢查。但是,特別是,GetMethodID的返回值是什麼,它是否會拋出一個Java異常(使用'ExceptionCheck'進行檢查並使用'ExceptionDescribe'進行調試)。 –

回答

0

我能夠解決我的問題,通過改變我的方法來確保單枚枚舉具有單枚枚舉值的枚舉,具有私有構造函數,私有實例和getInstance()方法的類。我曾經在其他地方讀過,JNI本身不能使用Java枚舉,但是我認爲Enum是一個類,我可以把它當作一個對象。顯然,這是不可能的。

0

您不能保存JNIEnv指針以用於其他線程。你必須通過調用AttachCurrentThread()在線程中獲得一個新的。

+0

我正在使用相同的線程。第二部分是在tick中,這是從我從JNIEnv *獲取的同一個線程中調用的。 – mpellegr

+0

證據和你的評論表明否則。誰調用了'tick()'?你還需要知道'jclass'是'jobject',並且可能還需要一個全局引用機制。 – EJP