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

最近在做一个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组合。

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值