项目代码:https://github.com/VincentWei95/ndk
Android JNI开发系列:第一章 JNIEnv接口指针
Android JNI开发系列:第二章 数据类型
Android JNI开发系列:第三章 对引用数据类型的操作
Android JNI开发系列:第四章 异常处理
Android JNI开发系列:第五章 局部和全局引用
Android JNI开发系列:第六章 线程
Android JNI开发系列:第七章 POSIX线程
Android JNI开发系列:第八章 POSIX Socket API 面向连接的通信
Android JNI开发系列:第九章 POSIX Socket API 无连接的通信
Android JNI开发系列:第十章 POSIX Socket API 本地通信
java中的同步:
synchronized(obj) { // 同步安全的代码块 }JNI中的同步:
if ((*env)->MonitorEnter(env, obj) != JNI_OK) { // 错误处理 } // 在MonitorEnter()和MonitorExit()之间是线程同步的 // MonitorEnter()和MonitorExit()是成对存在的,避免死锁 if ((*env)->MonitorExit(env, obj) != JNI_OK) { // 错误处理 }因为虚拟机并不知道原生线程,因此它们不能与java构件直接通信。
JNI通过JavaVM接口指针提供了 AttachCurrentThread 函数以便于让原生代码将原生线程附着到虚拟机上。
JavaVM* cachedJvm; ... JNIEnv* env; ... // 将当前线程附着到虚拟机 (*cachedJvm)->AttachCurrentThread(cachedJvm, &env, NULL); // 上面函数获得的JNIEnv接口实现线程与java应用程序的通信 // 将当前线程与虚拟机分离 (*cachedJvm)->DetachCurrentThread(cachedJvm);