作者:海螺里的秘密_471 | 来源:互联网 | 2023-09-18 19:35
最近在做一个JNI项目———C回调Java代码的地方出现了如下一个错误:
JNI DETECTED ERROR IN APPLICATION: can't call void com.crycheck.jni.CryCheckJNI.voiceCheckCallBack(int) on instance of java.lang.Class
出现这个问题的原因其实很简单, 有过JNI编程经验的就会知道,调用方法分static和非static两种,分别会用到GetMethodID+CallMethod和GetStaticMethodID+CallStaticMethod,其中指Int, Long, Char等类型,具体运用哪一个取决于你调用回调的C方法对应的native方法是否为static方法,如果是则采用GetStaticMethodID+CallStaticMethod,如果不是则采用GetMethodID+CallMethod。
我出现的问题原因就是静态的native接口方法要去回调非静态的java方法,错误的回调写法如下图
![这里写图片描述](https://img-blog.csdn.net/20170118143822874?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvb01yTGVmdDEyMw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
native接口对应的c方法截图如下:
![这里写图片描述](https://img-blog.csdn.net/20170118144334500?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvb01yTGVmdDEyMw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
解决方法
- 去掉native接口的static修辞符;
- 将回调方法改成静态方法,并将在C方法里采用GetStaticMethodID+CallStaticMethod的组合。
规律总结:native接口和java回调方法都得同时为static和非static,当然对应的c方法里面也要用上对应的GetStaticMethodID+CallStaticMethod的组合或GetMethodID+CallMethod组合。