Android JNI回调java接口方法学习

a 夏天 提交于 2019-12-02 08:15:17

代码主要分为Java层(java代码)和JNI层(c语言代码),首先看看Java层的代码(Native.java)。

wKioL1L7ZPiyvTiPAADDEuc_Wbw909.jpg

 

如上所示,Java层与JNI层的接口代码主要封装在Native类中,该类定义了三个native函数,分别完成jni库的初始化,调用jni层开启线程,调用jni层关闭线程等功能。并且提供一个回调函数(onNativeCallback),供jni层调用,并在回调函数中打印count的值。

 

再看看JNI层是如何开启线程并回调Java层的(native.c),关键的地方都在代码中进行了注释:

 

   1. 头文件包含和全局变量的定义

           

wKioL1L7ZBDwkV59AACTbPzbzNQ617.jpg

         

   2. 初始化函数的实现

             

wKiom1L7ZIbTsjOKAAFIuzwXk8Y519.jpg

 

   3. 开启关闭线程的实现

 

wKioL1L7ZJmzWiS0AAGUkitcgGU680.jpg

                                           

 4. 线程的实现(关键)

 

wKiom1L7ZOLzJXksAAH5ssQLh0E515.jpg

 

   由上述代码可以看到,JNI层通过pthread库完成了线程的创建,需要特别注意的是,JNI层的线程中,必须通过全局的JavaVM来获取到环境变量,也必须通过全局的jobject获取java类对象,从而找到java端的函数,进行回调。

1. 在onload的时候保存JavaVM指针。

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/

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!