JNI DETECTED ERROR IN APPLICATION: can't call void XXX on instance of java.lang.Class 解決方案

最近在做一個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方法截圖如下: 
這裏寫圖片描述

解決方法

  1. 去掉native接口的static修辭符;
  2. 將回調方法改成靜態方法,並將在C方法裏採用GetStaticMethodID+CallStaticMethod的組合。

規律總結:native接口和java回調方法都得同時爲static和非static,當然對應的c方法裏面也要用上對應的GetStaticMethodID+CallStaticMethod的組合或GetMethodID+CallMethod組合。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章