Android(安卓)JNI开发详解(7)-线程操作,异常处理
16lz
2022-07-02
原文出处:http://www.ccbu.cc/index.php/android/android-jni-thread-exception.html
线程操作
JNIEnv指针仅在创建它的线程有效。C/C++创建的线程默认是没有附加到JVM的,如果我们需要在本地线程线程访问JVM,那么必须先调用AttachCurrentThread
将当前线程与JVM进行关联,然后才能获得JNIEnv对象。线程退出或不再需要使用JNIEnv时,我们必须通过调用DetachCurrentThread
来解除连接,否则可能会导致线程不能正常退出或程序奔溃等问题。
函数 | 说明 |
---|---|
AttachCurrentThread | 将当前线程附件到JVM |
DetachCurrentThread | 解除当前线程与JVM的连接 |
Java中访问native方法并没有线程限制,所以我们的本地代码并不一定只会运行在main线程中 ,同时本地C/C++也可用创建子线程,在多线程的情况下,就不得不考虑 线程同步问题了。 Java中,JDK为我们提供了synchronized来处理多线程同步代码块 ,相应的在JNI中也提供了两个函数来完成线程同步。
函数 | 说明 |
---|---|
MonitorEnter | 进入临界区 |
MonitorExit | 退出临界区 |
异常处理
C++中可以使用其内部的异常机制,但是这套机制抛出的异常并不会传递给我们的JVM,所以为了你补这个缺点,JNI实现了一套可以和JVM进行交流的异常机制 。
函数 | 说明 |
---|---|
Throw | 抛出已有的异常对象 |
ThrowNew | 抛出一个新异常对象 |
ExceptionOccurred | 获取JVM抛出的异常 |
ExceptionDescribe | 输出错误日志 |
ExceptionClear | 清空异常信息 |
FatalError | 产生一个严重的错误 |
ExceptionCheck | 检查是否存在异常信息 |
更多相关文章
- 箭头函数的基础使用
- Python技巧匿名函数、回调函数和高阶函数
- 浅析android通过jni控制service服务程序的简易流程
- 浅析Android中的消息机制-解决:Only the original thread that cr
- Android异步消息机制之Handler
- Android的Handler机制详解3_Looper.looper()不会卡死主线程
- Android(安卓)bluetooth介绍(四): a2dp connect流程分析
- Android之Handler用法总结
- Android架构分析之使用自定义硬件抽象层(HAL)模块