代碼主要分爲Java層(java代碼)和JNI層(c語言代碼),首先看看Java層的代碼(Native.java)。java
如上所示,Java層與JNI層的接口代碼主要封裝在Native類中,該類定義了三個native函數,分別完成jni庫的初始化,調用jni層開啓線程,調用jni層關閉線程等功能。而且提供一個回調函數(onNativeCallback),供jni層調用,並在回調函數中打印count的值。函數
再看看JNI層是如何開啓線程並回調Java層的(native.c),關鍵的地方都在代碼中進行了註釋:.net
1. 頭文件包含和全局變量的定義線程
2. 初始化函數的實現指針
3. 開啓關閉線程的實現對象
4. 線程的實現(關鍵)blog
由上述代碼能夠看到,JNI層經過pthread庫完成了線程的建立,須要特別注意的是,JNI層的線程中,必須經過全局的JavaVM來獲取到環境變量,也必須經過全局的jobject獲取java類對象,從而找到java端的函數,進行回調。接口
1. 在onload的時候保存JavaVM指針。get
2. 在自定義jni方法裏(該方法須在callback方法使用前調用,例如初始化方法)保存callback方法所在對象,
且該對象須要建立一個全局引用以便在線程方法裏使用,默認是local ref,函數執行完會被虛擬機釋放;
另外自定義jni方法和callback方法在同一個類裏,因此在調用自定義方法時能保存一致的jobject 。回調函數
3. 也是在自定義jni方法中,經過class得到該callback的method ID。
參考:http://blog.csdn.net/zhengxinwcking/article/details/24718499
參考:http://ticktick.blog.51cto.com/823160/1358558/