Android(安卓)NDK(八):JNI多线程
今天来唠唠JNI中关于多线程。多线程,即多个线程同时工作,多线程的问题比较复杂,在实际情况下可能会面临众多的问题。JNI中也提供了一系列函数帮助我们完成多线程交互。博客内容大致分为如下:
1. 同步代码块
2. 等待唤醒
一、同步代码块
如果本地代码要运行在多个线程环境中,可能会面临同时共享资源的情况。这种情况下,为了避免资源占有问题,需要我们进行同步处理。
Java中,JDK为我们提供了synchronized来处理多线程同步代码块。
synchronized (Obj.class) {
// 业务处理
}
本地代码中,JNI提供了两个函数来完成上面的同步:
(1)MonitorEnter:进入同步代码块
(2)MonitorExit:退出同步代码块
上述代码,程序必须先进入obj的监视器,再执行同步代码块中的代码。如果另一个线程已经进入了与这个obj监视器的话,当前线程会阻塞。
如果当前线程在不拥有监视器即没有调用MonitorEnter的情况下,调用MonitorExit,系统会产生一个错误,并抛出异常。所以两个方法必须成对出现。
同样在上述代码中,我们看到了对两个函数的错误检查,因为有可能会执行失败,比如创建监视器时,资源分配不成功等原因。同样,在代码发生异常时,记得调用MonitorExit方法退出同步代码块:
我们可以发现在本地代码中处理同步代码块要比java中复杂的多,所以,尽量用Java来做同步吧,把与同步相关的代码都移到Java中去。
二、等待唤醒
Java中提供了Object.wait、Object.notify和Object.notifyAll来执行多线程的交互操作。但是在JNI中却没有提供与之对应的函数。不过我们可以通过JNI调用Java中的这些函数。
上面代码中,假设我们已经缓存了方法的ID。定义了三个对应的方法来调用Jvm中的wait,notify,notifyAll函数即可。
关于JNI中多线程的介绍就是这些,内容比较浅,但是基本涵盖了要用的方式,还希望大家在实践当中去深刻体会。
更多相关文章
- Android通过多点触控的方式对图片进行缩放的实例代码
- Android(安卓)NDK的C/C++代码中利用JNI回调实现字符编码转换
- Android(安卓)NDK编译本地文件以及引用第三方so文件
- Android(安卓)Studio如何查看资源或者函数在哪些类中被引用
- 如何在Android中使用汇编语言
- android 逆向工程
- 【Android游戏开发二十五】在Android上的使用《贝赛尔曲线》!
- Android中怎么破解游戏之修改金币数
- ANDROID Bionic C DOCS