2、native层回调java层:
native层没有自己的线程,只是在java调用native代码,native代码的某个位置,需要回访java层的代码以实现某些功能,这种情况比较简单,网上绝大多数讨论的都是这方面的。
native层建立了自己的线程,在线程中需要回访java层,这时候,native线程通过jvm获取JNIEnv时,不能成功。
原因分析:android 源码中的文档: platform\dalvik\docs\jni-tips.html 中有一段:FindClass didn't find my class 对此做了分析。
通过网上的资料,发现native线程通过jvm获取JNIEnv时,和普通的jni函数不一致,需要将线程attach到jvm才可以。可以通过 AttachCurrentThread 来获取 JNIEnv,实际上这个函数的功能不只是获取JNIEnv这么简单,其主要作用是将线程绑定到jvm,这实际上会导致native线程不结束,jvm就不会结束。关于这个问题,可以参考《JNI_OnLoad 的非預期現象 》:http://www.360doc.com/showWeb/0/0/114075885.aspx
3、关于多线程jni回调java,google groups中有如下讨论
http://groups.google.com/group/android-ndk/browse_thread/thread/f40a3ec8413e8b77/534f2ef35b802e08
已被转载备份到如下地址:
http://www.360doc.com/showWeb/0/0/114078345.aspx
4、有一篇文档《多線程的JNI Native 》: http://www.docin.com/p-104345715.html 也对这方面有演示例子
4、关于native to java 的回调机制有如下讨论:
http://groups.google.com/group/android-ndk/browse_thread/thread/618ff83dd88694b
已被转载备份到:http://www.360doc.com/showWeb/0/0/114084161.aspx
5、jvm->getEnv,在不同的线程中运行时,获得的值应该是不一致的。导致了上述的问题。
6、sun官网文档:http://java.sun.com/docs/books/jni/html/functions.html
有对这方面的函数的描述