文档章节

JNI错误解决ERROR detaching thread with interp frames

wangshyn2
 wangshyn2
发布于 2014/12/31 16:10
字数 333
阅读 677
收藏 0

写JNI在C++中回调Java中的函数,一般过程如下:

1. 先获取到JNIEnv*

获取方法:

 static JNIEnv* getJNIEnv(JavaVM* pJavaVM)
    {
    	JavaVMAttachArgs lJavaVMAttachArgs;
    	lJavaVMAttachArgs.version = JNI_VERSION_1_6;
    	lJavaVMAttachArgs.name = "NativeCallBack";
    	lJavaVMAttachArgs.group = NULL;
    	JNIEnv* lEnv;
    	if((pJavaVM)->AttachCurrentThread(&lEnv, &lJavaVMAttachArgs) != JNI_OK){
    		lEnv = NULL;
    	}
    	return lEnv;
    }

这里面需要调用AttachCurrentThread,来获取到Java函数的运行环境。

2. 通过JNI函数调用Java的函数

3. 最后调用DetachCurrentThread来释放getJNIEnv中获取的运行运行环境


然而,如果C++代码执行的回调实际是Java的线程,那么AttachCurrentThread函数虽然会执行成功(没有重新Attach),但是,在调用DetachCurrentThread会导致当前Java线程执行环境被Detach,导致:ERROR detaching thread with interp frames的错误。

所以,需要在getJNIEnv之前,先用

jint        (*GetEnv)(JavaVM*, void**, jint);

函数尝试获取JNIEnv,如果获取成功,说明当前执行的线程是Java线程。否则就是C++线程,需要调用getJNIEnv来获取Java环境。

比较完善的回调过程如下:

extern "C"
void callJavaMethod(int param){
        JavaVM* jvm = NULL;
        int status = env->GetJavaVM(&jvm);
	if(status!=0 || jvm == NULL) {
	        LOGI("GetJavaVM init fail");
		return;
	}
	JNIEnv* env = NULL;
	bool needDetach = false;
	if (jvm->GetEnv((void**) &env, JNI_VERSION_1_6) != JNI_OK) {
		env = getJNIEnv(jvm);
		needDetach = true;
		LOGI("got Env by attach Thread");
	}

	if (env == NULL)
	{
		LOGI("getJNIEnv failed");
		return;
	}
	//Call java Method 
	LOGI("callback success");
	if(needDetach){
		jvm->DetachCurrentThread();
	}
}


参考资料:

1 http://stackoverflow.com/questions/13028247/android-spotify-error-detaching-thread-with-interp-frames-count-28


© 著作权归作者所有

wangshyn2
粉丝 2
博文 15
码字总数 4586
作品 0
闸北
私信 提问
加载中

评论(1)

c
cuit_zzh
犀利,试了ok
Android JNI 定位错误日志,Signal 11 C不是很好,求助一下广大的Oscer

下面 红色标注出来的那一行有错误,不确定是数组越界还是空指针;以下是关键的几行日志 JNI ERROR: env->self != thread-self (0x6fcc1630 vs. 0x6fb7ea88); auto-correcting trying to wor...

Keyoumi
2015/07/10
844
0
NetBeans提示出错,搞不明白,请教!

NetBeans IDE 7.2 保存键虚显,无法保存。 运行后提示没找到主类 Error: Could not find the main class. Error: A JNI error has occurred, please check your installation and try again ......

xue_xueyi
2012/12/09
4K
3
java fatal error log

翻译于《Troubleshooting Guide for JavaSE6 with HotSpotVM》 1. 生成位置 -XX:ErrorFile=/fullpath/file,file里可以包含%p表示进程id。如果没声明,默认的名字是hserrpid.log,保存在进程...

yingtju
2018/06/29
0
0
Android 开发之JNI学习笔记

JNI—java native interface 官方文档 JNI is the Java Native Interface. It defines a way for managed code (written in the Java programming language) to interact with native code ......

Angels_安杰
2015/11/20
614
0
错误: operand of '->' has non-pointer type 'JNIEnv

编译JNI的错误日志: D:TVMaoWorkSpaceDramaAppTestJni>ndk-build Android NDK: WARNING: APP_PLATFORM android-19 is larger than android:minSdkVersi on 14 in ./AndroidManifest.xml [ar......

SuShine
2015/08/20
873
0

没有更多内容

加载失败,请刷新页面

加载更多

代理模式之JDK动态代理 — “JDK Dynamic Proxy“

动态代理的原理是什么? 所谓的动态代理,他是一个代理机制,代理机制可以看作是对调用目标的一个包装,这样我们对目标代码的调用不是直接发生的,而是通过代理完成,通过代理可以有效的让调...

code-ortaerc
今天
5
0
学习记录(day05-标签操作、属性绑定、语句控制、数据绑定、事件绑定、案例用户登录)

[TOC] 1.1.1标签操作v-text&v-html v-text:会把data中绑定的数据值原样输出。 v-html:会把data中值输出,且会自动解析html代码 <!--可以将指定的内容显示到标签体中--><标签 v-text=""></......

庭前云落
今天
8
0
VMware vSphere的两种RDM磁盘

在VMware vSphere vCenter中创建虚拟机时,可以添加一种叫RDM的磁盘。 RDM - Raw Device Mapping,原始设备映射,那么,RDM磁盘是不是就可以称作为“原始设备映射磁盘”呢?这也是一种可以热...

大别阿郎
今天
12
0
【AngularJS学习笔记】02 小杂烩及学习总结

本文转载于:专业的前端网站☞【AngularJS学习笔记】02 小杂烩及学习总结 表格示例 <div ng-app="myApp" ng-controller="customersCtrl"> <table> <tr ng-repeat="x in names | orderBy ......

前端老手
昨天
16
0
Linux 内核的五大创新

在科技行业,创新这个词几乎和革命一样到处泛滥,所以很难将那些夸张的东西与真正令人振奋的东西区分开来。Linux内核被称为创新,但它又被称为现代计算中最大的奇迹,一个微观世界中的庞然大...

阮鹏
昨天
19
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部