JNI DETECTED ERROR IN APPLICATION: can't call void XXX on instance of java.lang.Class <XXX>解决方案
2017-03-23 01:44
1141 查看
最近在做一个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>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组合。
相关文章推荐
- JNI DETECTED ERROR IN APPLICATION: can't call void XXX on instance of java.lang.Class <XXX>解决方案
- Bug-JNI: JNI DETECTED ERROR IN APPLICATION: JNI CallVoidMethodV called with pending exception 'java.
- JNI DETECTED ERROR IN APPLICATION: java_class == null
- Android java.lang.NoSuchFieldError: No static field xxx of type I in class Lcom/XX/R$id; or its superclasses
- JNI DETECTED ERROR IN APPLICATION: JNI CallVoidMethodV called with pending exception '
- cocos2dx JNI DETECTED ERROR IN APPLICATION: illegal class name 'XXX'的错误修复
- java.lang.VerifyError: Bad <init> method call from inside of a branch
- 二、Java.lang.NoSuchFieldError: No static field xxx of type I in class Lcom/XX/R$id; or
- java.lang.VerifyError:XXX <init> signature: ()V) Constructor must call super() or this()
- java.lang.VerifyError: Bad <init> method call from inside of a branch
- Android之JNI DETECTED ERROR IN APPLICATION: illegal class name 'XXX'的错误解决方法
- JNI DETECTED ERROR IN APPLICATION:java.lang.SecurityExceptionandroid--解决JNI安全权限异常
- java.lang.NoSuchFieldError: No static field xxx of type I in class Lcom/XX/R$id; or its superclasses
- java.lang.NoSuchFieldError: No static field xxx of type I in class Lcom/XX/R$id; or its superclasses
- DETECTED ERROR IN APPLICATION: JNI GetMethodID called with pending exception java.lang.NoSuchMethodE
- java.lang.NoSuchFieldError: No static field xxx of type I in class Lcom/XX/R$id; or its superclasses
- SEVERE: Error configuring application listener of class com.sun.xml.ws.transport.http.servlet.WSServletContextListener java.lang.ClassNotFoundExceptio
- JNI DETECTED ERROR IN APPLICATION: java_object == null
- 严重: Error configuring application listener of class com.sun.faces.config.ConfigureListener java.lang
- 当传入数据只有一个时mybatis中<if>判断会出现There is no getter for property named 'subjectId' in 'class java.lang....