JNI与多线程
在android开发过程中,由于主线程要聚焦于UI交互,为了软件运行流畅必然要用到很多多线程技术。而在JNI机制中专门提供了一些避免线程冲突的函数。了解、学习并掌握如何避免线程冲突问题是一个程序猿的必修课。下面简单介绍一下JNI与多线程。
在JNI机制中,每一个线程进入本地函数(即c语言层)都会分配一个JNIenv对象,即是每个函数中第一个参数*env。env其实是VM的一个代理,通过env可以请求VM实现某些功能。就像每个进程都有一个独立的VM一样,每个通过JNI进入c层的线程都会分配一个env代理。这个env中包含了线程信息,并且每个线程只有一个全局的、伴随线程周期的env。各个线程的env之间彼此独立,当且仅当线程第一次进入JNI时分配env对象,该对象一直存在直到线程死掉。之后每次线程再进入时使用原有的env对象。
这个env对象类似web开发中session的概念,对每一个客户端建立一个会话并保存,会话中可存放专属用某客户端数据以实现线程冲突。
JNI中只有某些平台支持将变量存入env中,对于解决线程冲突问题,JNI提供的思路是加锁。以下是JNI对线程加锁的代码:
//加锁
env->monitorEnter(syncObj);
//执行代码
//解锁
env->monitorExit(syncObj);