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