最近在做一個JNI項目———C回調Java代碼的地方出現瞭如下一個錯誤:
JNI DETECTED ERROR IN APPLICATION: can't call void com.crycheck.jni.CryCheckJNI.voiceCheckCallBack(int) on instance of java.lang.Class<com.crycheck.jni.CryCheckJNI>
- 1
出現這個問題的原因其實很簡單, 有過JNI編程經驗的就會知道,調用方法分static和非static兩種,分別會用到GetMethodID+CallMethod和GetStaticMethodID+CallStaticMethod,其中指Int, Long, Char等類型,具體運用哪一個取決於你調用回調的C方法對應的native方法是否爲static方法,如果是則採用GetStaticMethodID+CallStaticMethod,如果不是則採用GetMethodID+CallMethod。
我出現的問題原因就是靜態的native接口方法要去回調非靜態的java方法,錯誤的回調寫法如下圖
native接口對應的c方法截圖如下:
解決方法
- 去掉native接口的static修辭符;
- 將回調方法改成靜態方法,並將在C方法裏採用GetStaticMethodID+CallStaticMethod的組合。
規律總結:native接口和java回調方法都得同時爲static和非static,當然對應的c方法裏面也要用上對應的GetStaticMethodID+CallStaticMethod的組合或GetMethodID+CallMethod組合。