Android JNI开发系列:第六章 线程

该博客围绕Android JNI开发展开,介绍了从JNIEnv接口指针到POSIX Socket API本地通信等多方面内容。重点阐述了同步,包括Java和JNI中的同步情况,还提及原生线程,指出虚拟机不知原生线程,JNI通过JavaVM接口指针让原生代码将其附着到虚拟机。

项目代码: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 本地通信

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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值