原文出处: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 检查是否存在异常信息

更多相关文章

  1. Android View Touch的事件分发机制
  2. Android线程与进程(二)线程详解
  3. AsyncTask,IntentService工作原理分析&Android线程池
  4. Android中用AsyncTask简单实现多线程
  5. Android 学习 笔记_08. 广播机制

随机推荐

  1. 看见有人发帖“php能做什么”,我不得不也
  2. Laravel Auth只验证管理员/超级用户
  3. 如何用PHP和MYSQL在逗号分隔的列表中找到
  4. phpStudy 2016 更新下载,新版支持php7.0
  5. 2016.5.27 php测试中敏感度高,怎么调整
  6. jsonencode添加一个空行,为什么?
  7. 如何将java中的值添加到php中?
  8. Validate PEAR包是否可以投入生产?
  9. [活动召集]福建PHP社区聚会
  10. 如何对继承对象进行单元测试?