JNI DETECTED ERROR IN APPLICATION: can't call void XXX on instance of java.lang.Class <XXX>解决方案
2017-01-18 14:53
856 查看
最近在做一个JNI项目———C回调Java代码的地方出现了如下一个错误:
出现这个问题的原因其实很简单, 有过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组合。
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>
出现这个问题的原因其实很简单, 有过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组合。
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android NDK开发之:配置环境的详解
- Android通过JNI实现守护进程
- 完美解决安卓jni项目会删除其他so文件的问题
- Android开发的IDE、ADT、SDK、JDK、NDK等名词解释
- Android提高之使用NDK把彩图转换灰度图的方法
- Android NDK开发详细介绍
- Android使用Jni实现压力锅数据检测效果示例
- Android NDK 生成以及调用so 文件
- JAVA中JNI的简单使用分享
- c++ mk文件出错Jni调用产生java.lang.UnsatisfiedLinkError错误解决方法
- 解析Java的JNI编程中的对象引用与内存泄漏问题
- Java的JNI快速入门教程(推荐)
- 探讨:如何在NDK中呼叫Java的class
- 安卓应用开发通过java调用c++ jni的图文使用方法
- Java调用c++库
- Android App 增量更新实例(Smart App Updates)