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

    xiaoxiao2025-07-09  16

    项目代码: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);
    最新回复(0)