|
1、關(guān)于jni調(diào)用種種情形的分析,可以參考一下如下網(wǎng)址中的文章:http://android./JNIExample/ 2、native層回調(diào)java層: native層沒有自己的線程,只是在java調(diào)用native代碼,native代碼的某個位置,需要回訪java層的代碼以實現(xiàn)某些功能,這種情況比較簡單,網(wǎng)上絕大多數(shù)討論的都是這方面的。 native層建立了自己的線程,在線程中需要回訪java層,這時候,native線程通過jvm獲取JNIEnv時,不能成功。 原因分析:android 源碼中的文檔: platform\dalvik\docs\jni-tips.html 中有一段:FindClass didn't find my class 對此做了分析。 通過網(wǎng)上的資料,發(fā)現(xiàn)native線程通過jvm獲取JNIEnv時,和普通的jni函數(shù)不一致,需要將線程attach到j(luò)vm才可以??梢酝ㄟ^ AttachCurrentThread 來獲取 JNIEnv,實際上這個函數(shù)的功能不只是獲取JNIEnv這么簡單,其主要作用是將線程綁定到j(luò)vm,這實際上會導(dǎo)致native線程不結(jié)束,jvm就不會結(jié)束。關(guān)于這個問題,可以參考《JNI_OnLoad 的非預(yù)期現(xiàn)象》:http://www.woyoushebao.com/showWeb/0/0/114075885.aspx 3、關(guān)于多線程jni回調(diào)java,google groups中有如下討論 http://groups.google.com/group/android-ndk/browse_thread/thread/f40a3ec8413e8b77/534f2ef35b802e08 已被轉(zhuǎn)載備份到如下地址: http://www.woyoushebao.com/showWeb/0/0/114078345.aspx 4、有一篇文檔《多線程的JNI Native 》:http://www.docin.com/p-104345715.html 也對這方面有演示例子 4、關(guān)于native to java 的回調(diào)機制有如下討論: http://groups.google.com/group/android-ndk/browse_thread/thread/618ff83dd88694b 已被轉(zhuǎn)載備份到:http://www.woyoushebao.com/showWeb/0/0/114084161.aspx 5、jvm->getEnv,在不同的線程中運行時,獲得的值應(yīng)該是不一致的。導(dǎo)致了上述的問題。 6、sun官網(wǎng)文檔:http://java./docs/books/jni/html/functions.html 有對這方面的函數(shù)的描述 |
|
|