Android JNI回調java接口方法學習

代碼主要分爲Java層(java代碼)和JNI層(c語言代碼),首先看看Java層的代碼(Native.java)。java

wKioL1L7ZPiyvTiPAADDEuc_Wbw909.jpg

 

如上所示,Java層與JNI層的接口代碼主要封裝在Native類中,該類定義了三個native函數,分別完成jni庫的初始化,調用jni層開啓線程,調用jni層關閉線程等功能。而且提供一個回調函數(onNativeCallback),供jni層調用,並在回調函數中打印count的值。函數

 

再看看JNI層是如何開啓線程並回調Java層的(native.c),關鍵的地方都在代碼中進行了註釋:.net

 

   1. 頭文件包含和全局變量的定義線程

           

wKioL1L7ZBDwkV59AACTbPzbzNQ617.jpg

         

   2. 初始化函數的實現指針

             

wKiom1L7ZIbTsjOKAAFIuzwXk8Y519.jpg

 

   3. 開啓關閉線程的實現對象

 

wKioL1L7ZJmzWiS0AAGUkitcgGU680.jpg

                                           

 4. 線程的實現(關鍵)blog

 

wKiom1L7ZOLzJXksAAH5ssQLh0E515.jpg

 

   由上述代碼能夠看到,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/

相關文章
相關標籤/搜索