jni thread 退出异常 , native thread exited without detaching

jiangpingzhan 2011-04-07 02:22:50
线程退出时控制台出现以下异常 :

thread exiting, not yet detached (count=0)
thread exiting, not yet detached (count=1)
native thread exited without detaching

代码中已经设置分离线程模式. 请指教


pthread_attr_t pulseTattr;
pthread_t pulseThread;
memset(&pulseThread, 0, sizeof(pthread_t));
memset(&pulseTattr, 0, sizeof(pthread_attr_t));
int err;
err = pthread_attr_init (&pulseTattr);

err = pthread_attr_setdetachstate (&pulseTattr,PTHREAD_CREATE_DETACHED);

err = pthread_create(&pulseThread,&pulseTattr,sendPulsePackThread,&sk);
if(err != 0)
{
__android_log_write(ANDROID_LOG_ERROR,"Tag","pthread_create fail \n");
}
else
{
__android_log_write(ANDROID_LOG_ERROR,"Tag","pthread_create succ \n");
}







void *sendPulsePackThread(void *args)
{
T_Socket *s = (T_Socket*)args;
DATAHEAD dataHead;
dataHead.HeadFlag = '1111';
dataHead.lLen = 0;
while(pulseOpen==1)
{
sleep(10);
if(SendData(s->socket,(char*)&dataHead,sizeof(DATAHEAD),10) == SOCKET_ERROR)
{
__android_log_write(ANDROID_LOG_ERROR,"Tag","sendPulsePackThread send fail \n");
}
__android_log_write(ANDROID_LOG_ERROR,"Tag","sendPulsePackThread mark \n");
}
__android_log_print(ANDROID_LOG_ERROR,"Tag", " pulseOpen :%d \n", pulseOpen);

__android_log_write(ANDROID_LOG_ERROR,"Tag","sendPulsePackThread mark \n");
// pthread_detach(pthread_self());

__android_log_write(ANDROID_LOG_ERROR,"Tag","sendPulsePackThread exit \n");

pthread_exit((void *)0);
}
...全文
2160 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
一只农民工 2013-05-17
  • 打赏
  • 举报
回复
同求答案 下面这段代码是c++代码创建的线程反复调用,并传递数据的 if (_env == NULL) { if (_javaVM == NULL) return -1; _javaVM->AttachCurrentThread(&_env, NULL); if (_env == NULL) return -1; } if (_context == NULL) return -1; jclass cls = _env -> GetObjectClass(_context); LOGE("data addr = %x , len %d", data, len); jmethodID cb_method = (_env)->GetMethodID(cls,"callback","(I[CI)I"); //LOGE("SendPacket %d " , temp);temp++; (_env)->CallIntMethod(_context,cb_method,channel,data,len); _env->DeleteLocalRef(cls); //_javaVM->DetachCurrentThread(); 调用_javaVM->DetachCurrentThread(); 直接挂掉了 05-17 15:50:09.234: E/dalvikvm(7126): JNI ERROR: env->self != thread-self (0x65b9d528 vs. 0x0); auto-correcting
为毛呀 2012-07-25
  • 打赏
  • 举报
回复
你好,这个问题怎么解决的呀?我现在也遇到这个问题。
jiangpingzhan 2011-04-08
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 zhuzeitou 的回复:]
说的应该是这个
DetachCurrentThread
[/Quote]

非常感谢. 就是这个问题.


多线程问题

  本地方法接收 JNI 接口指针作为一个参数。但是,一个想要将事件委托回其关联 Java 代理的本地侦听器没有现成的 JNI 接口指针。一旦获得 JNI 接口指针,应该将其保存起来以便后续使用。

  JNI 接口指针只在当前线程中有效。实现 JNI 的 JVM 可以在 JNI 接口指针指向的区域中分配和存储本地线程数据。这意味着您也需要以本地线程数据保存 JNI 接口指针。

  JNI 接口指针可以两种方式获得:

一旦线程使用 JNI_CreateJavaVM 创建了 JVM,JNI 将接口指针值放在由第二个参数指定的位置。然后该值可以保存在本地线程区域中。


如果 JVM 已由进程中某个其他线程创建,当前线程可以调用 AttachCurrentThread。JNI 将接口指针值放在由第一个参数指定的位置。
  但是这还没有完。需要记住的是,程序是以 C/C++ 语言编写的,因此,无法使用自动垃圾回收,因为程序不是使用 Java 语言编写的。一旦线程完成 JNI 调用,它需要通过调用 DetachCurrentThread 来释放接口指针。如果未做此调用并且线程存在,进程将无法正常终止。相反,它将一直等待现在已不存在的线程以 DestroyJavaVM 调用的方式从 JVM 中离开。

jiangpingzhan 2011-04-08
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 zhuzeitou 的回复:]
说的应该是这个
DetachCurrentThread
[/Quote]

我已经设置成分离线程了. 还需要在代码中用DetachCurrentThread 指定分离吗
zhuzeitou 2011-04-08
  • 打赏
  • 举报
回复
说的应该是这个
DetachCurrentThread
jiangpingzhan 2011-04-08
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 oexpress 的回复:]
你给代码大写LOG看到地那一句出错了
[/Quote]

sendPulsePackThread 执行完就出异常了
jiangpingzhan 2011-04-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ultrapro 的回复:]
detach 的代码执行到了么?
[/Quote]


是sendPulsePackThread 这个函数有执行到了吗 ? 有执行里面的代码
CyberLogix 2011-04-07
  • 打赏
  • 举报
回复
你给代码大写LOG看到地那一句出错了
儿大不由爷 2011-04-07
  • 打赏
  • 举报
回复
detach 的代码执行到了么?

80,337

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧