JNI层线程回调Java函数示例
2016-07-14 09:48
357 查看
摘自http://www.linuxidc.com/Linux/2014-03/97562.htm
JNI是Java Native Interface的缩写,是Java平台的重要特性,使得Java代码可以方便地与C/C++代码编译生成的动态链接库进行交互。本文主要给出一份示例代码(工程文件见附件),描述如何在Android的JNI层开启一个线程,并在线程中回调Java层的函数。
代码主要分为Java层(java代码)和JNI层(c语言代码),首先看看Java层的代码(Native.java)。
如上所示,Java层与JNI层的接口代码主要封装在Native类中,该类定义了三个native函数,分别完成jni库的初始化,调用jni层开启线程,调用jni层关闭线程等功能。并且提供一个回调函数(onNativeCallback),供jni层调用,并在回调函数中打印count的值。
再看看JNI层是如何开启线程并回调Java层的(native.c),关键的地方都在代码中进行了注释:
1. 头文件包含和全局变量的定义
2. 初始化函数的实现
3. 开启关闭线程的实现
4. 线程的实现(关键)
由上述代码可以看到,JNI层通过pthread库完成了线程的创建,需要特别注意的是,JNI层的线程中,必须通过全局的JavaVM来获取到环境变量,也必须通过全局的jobject获取java类对象,从而找到java端的函数,进行回调。
代码的工程文件见附件,编译运行后,会在logcat调试窗口不断打印count的值。本文就介绍到这,主要是提供一份示例代码给初学者,有疑问欢迎留言或者来信lujun.hust@gmail.com交流。
JNI是Java Native Interface的缩写,是Java平台的重要特性,使得Java代码可以方便地与C/C++代码编译生成的动态链接库进行交互。本文主要给出一份示例代码(工程文件见附件),描述如何在Android的JNI层开启一个线程,并在线程中回调Java层的函数。
代码主要分为Java层(java代码)和JNI层(c语言代码),首先看看Java层的代码(Native.java)。
如上所示,Java层与JNI层的接口代码主要封装在Native类中,该类定义了三个native函数,分别完成jni库的初始化,调用jni层开启线程,调用jni层关闭线程等功能。并且提供一个回调函数(onNativeCallback),供jni层调用,并在回调函数中打印count的值。
再看看JNI层是如何开启线程并回调Java层的(native.c),关键的地方都在代码中进行了注释:
1. 头文件包含和全局变量的定义
2. 初始化函数的实现
3. 开启关闭线程的实现
4. 线程的实现(关键)
由上述代码可以看到,JNI层通过pthread库完成了线程的创建,需要特别注意的是,JNI层的线程中,必须通过全局的JavaVM来获取到环境变量,也必须通过全局的jobject获取java类对象,从而找到java端的函数,进行回调。
代码的工程文件见附件,编译运行后,会在logcat调试窗口不断打印count的值。本文就介绍到这,主要是提供一份示例代码给初学者,有疑问欢迎留言或者来信lujun.hust@gmail.com交流。
相关文章推荐
- Java序列化与反序列化
- myeclipse2015 1.0破解
- 关于Java并发编程的总结和思考
- java对象引用级别
- (error/warning)java Unsafe等改变安全性的类怎样去掉eclipse错误提示
- 初次从eclipse转到intellij idea上的一些经验
- JAVA.NET.SOCKETEXCEPTION: TOO MANY OPEN FILES解决方法
- Java中两种停止线程的方法
- java正则表达式方法介绍
- 框架-------(二)Spring和SpringMVC框架(序列一初始原理概念)
- Java中的时间日期处理
- SSM框架——详细整合教程(Spring+SpringMVC+MyBatis)
- java总结
- Failed to load javahl library
- Ubuntu安装MyEclipse
- java中的getClass()函数
- Java之MD5加密
- java 发送邮件
- Eclipse/myEclipse 代码提示/自动提示/自动完成设置
- GsonFormat的使用