相关文章推荐
严肃的围巾  ·  Why I'm getting ...·  1 月前    · 
严肃的围巾  ·  pandas object转string·  6 月前    · 
严肃的围巾  ·  验证码_·  11 月前    · 
严肃的围巾  ·  WPF ...·  11 月前    · 
严肃的围巾  ·  TLS certificate ...·  1 年前    · 
豪情万千的眼镜  ·  智能指针reset()·  1小时前    · 
任性的筷子  ·  std::packaged_task::re ...·  1小时前    · 
爱喝酒的火车  ·  QueryMetricByPage - ...·  1小时前    · 
一身肌肉的大葱  ·  Solving the ...·  1小时前    · 
玩篮球的火锅  ·  日常点滴 - 一抹浅笑 ·  1小时前    · 
奔放的包子  ·  How to use OpenAPI in ...·  3 小时前    · 
刚毅的刺猬  ·  I want to dock my ...·  3 小时前    · 

java中要访问C++代码时, 使用JNI是唯一选择. 然而,在 多线程 的情况下, 可能出现以下问题:

问题描述:
一个java对象通过JNI调用DLL中一个send()函数向服务器发送消息,不等服务器消息到来就立即返回.同时
把JNI接口的指针JNIEnv *env,和jobject obj保存在DLL中的变量里.

一段时间后,DLL中的消息接收线程接收到服务器发来的消息,
并试图通过保存过的env和obj来调用先前的java对象的方法来处理此消息.

然而,JNI文档上说,JNI接口的指针JNIEnv*不能在c++的线程间共享,
在我的程序中,如果接收线程试图调用java对象的方法,程序会突然退出.

不知道有没有方法突破JNI接口的指针不能在多个c++线程中共享的限制?

解决办法:


http://java.sun.com/docs/books/jni/html/pitfalls.html#29161 提到,
JNI接口指针不可为多个线程共用,但是java虚拟机的JavaVM指针是整个jvm公用的. 于是,在DLL中可以调用:

 
推荐文章
严肃的围巾  ·  验证码_
11 月前