JNI DETECTED ERROR IN APPLICATION解决记录
来源:互联网 发布:python程序right方法 编辑:程序博客网 时间:2024/06/13 06:55
(1)第一个错误:
JNI DETECTED ERROR IN APPLICATION: calling static method xxxx with CallxxxxMethodV in call to CallxxxxMethodV
有过JNI编程经验的就会知道,调用方法分static和非static两种,分别会用到
GetStaticMethodID GetMethodID
CallStatic<type>Method Call<type>Method
其中<type>指Int, Long, Char等类型
问题的原因就是编写JNI代码的同事混用了这两种方式,先用了GetStaticMethodID,然后又用的非static的CallIntMethod方法,Android4.4之前版本JNI检查机制没有Android5.0之后的版本严格,所以没有报错,程序也不会崩溃,但正确的方式应该是GetMethodID+Call<type>Method,GetStaticMethodID+CallStatic<type>Method,这个问题解决后又接着又报出了下面的错误。
(2)第二个错误:
JNI DETECTED ERROR IN APPLICATION: native code passing in reference to invalid stack indirect reference table or invalid reference: 0xfff5f1b0
in call to CallVoidMethod <==这一行报错是问题的切入点
这个错误显示是CallVoidMethod的参数非法引用,网上找了一些相关问题的帖子,结合本地代码,发现最有可能的就是线程间不能直接传递JNIEnv和jobject这类线程专属属性值导致,要知道JavaVM是属于Java进程的,每个进程只有一个JavaVM,而这个JavaVM可以被多线程共享,但是JNIEnv和jobject是属于线程私有的,不能共享,那有什么办法解决呢?这里我们不讲JNIEnv的线程间传递,有兴趣的网上可以找到相关帖子,而jobject可以用全局引用的方式在多线程间使用,举个简单的例子:
- #Include <jni.h>
- #include <pthread.h>
- pthread_t pthread;
- jobject object;
- JavaVM* jvm;
- void *run(void *arg)
- {
- JNIEnv * jenv;
- jvm->AttachCurrentThread(&jenv, NULL);
- jenv->CallVoidMethod(object, jnv->GetMethodID(jnv->GetObjectClass(object), "foo", "()V"));
- jenv->DeleteGlobalRef(object);
- jvm->DetachCurrentThread();
- return NULL;
- }
- void Java_com_program_Initialize(JNIEnv*jenv, jobject caller)
- { /*要想在新线程中使用对象caller,就必须以全局引用方式保存,否则caller只是局部引用,本方法返回后就会销毁*/
- object = jnv->NewGlobalRef(caller);
- jenv->GetJavaVM(&jvm);
- pthread_create(&thread, NULL, run, NULL);
- }
- JNI DETECTED ERROR IN APPLICATION解决记录
- JNI DETECTED ERROR IN APPLICATION解决记录
- JNI DETECTED ERROR IN APPLICATION解决记录
- JNI DETECTED ERROR IN APPLICATION 解决记录
- Android JNI DETECTED ERROR IN APPLICATION的解决
- Android error: JNI DETECTED ERROR IN APPLICATION
- Android5.0: JNI DETECTED ERROR IN APPLICATION
- JNI DETECTED ERROR IN APPLICATION:java.lang.SecurityExceptionandroid--解决JNI安全权限异常
- JNI DETECTED ERROR IN APPLICATION: java_class == null
- Bug-JNI: JNI DETECTED ERROR IN APPLICATION: JNI CallVoidMethodV called with pending exception 'java.
- JNI DETECTED ERROR IN APPLICATION: JNI CallVoidMethodV called with pending exception '
- cocos2dx JNI DETECTED ERROR IN APPLICATION: illegal class name 'XXX'的错误修复
- 调用CallStaticObjectMethod报出JNI DETECTED ERROR IN APPLICATION: jclass is an invalid local reference:
- Android之JNI DETECTED ERROR IN APPLICATION: illegal class name 'XXX'的错误解决方法
- Unity Android 5.0上 JNI DETECTED ERROR IN APPLICATION: jclass is an invalid local reference
- ByteBuffer.allocate()/ByteBuffer.allocateDirect()/JNI DETECTED ERROR IN APPLICATION: jarray was NULL
- DETECTED ERROR IN APPLICATION: JNI GetMethodID called with pending exception java.lang.NoSuchMethodE
- strongswan报错:JNI DETECTED ERROR IN APPLICATION::use of deleted weak global reference 0xedc5338b
- 关于本地通遇到的问题及解决的方法
- 快吧游戏盒官方下载2016 v4.0.5.6959 官方最新版
- hadoop三个配置文件的参数含义说明
- ORACLE 11G R2 DG BROKER 自动FAILE OVER
- MVC设计模式下的Dao的设计以及基础框架的搭建(以对数据库进行插入和查询为例)
- JNI DETECTED ERROR IN APPLICATION解决记录
- js获取页面宽度高度及屏幕分辨率
- openstack中的setup.py和setup.cfg的理解
- 部署ArcGIS JS API 离线包(Tomcat与IIS)
- C# JSON字符串序列化与反序列化
- iOS 循环线程
- hibernate在crud时拦截
- OOP面向对象三大基石-封装、继承、多态
- mfc 内存dc