微课名称:
细说JNI与VM之关系
立即学习此微课:
-
方法:ADT学院为您播放(免费播放中)
微课目标:
在Android环境里,定义了两个主要的类别(或C的结构):JavaVM和JNIEnv。每一个进程只诞生一个VM实例,所以只有一个JavaVM对象。每一个线程(Thread)第一次进入VM调用本地函数时,VM会替它诞生一个相对映的JNIEnv对象。JNIEnv对象内含一个指针,正指向VM的函数表(Function Table)。于此,细说JNI与VM的密切关系。
微课介绍:
由于可以共享JavaVM对象指针,所以通常在VM加载*.so程序库时,会先调用JNI_OnLoad()函数,此刻就将JavaVM对象指针值储存于C层JNI模块里的全局(Global)变数里。Java层的线程调用C层的本地函数时,该线程必然经过VM,且VM一定替它诞生相对映的JNIEnv对象。当然能随时调用jvm->GetEnv()函数去取得该线程相对映的JNIEnv对象指针值。如果C/C++层自己创建的线程,就必须特别向VM登记。也就是,调用jvm->AttachCurrentThread()函数要求VM替它诞生一个相对映的JNIEnv对象,并且回传该对象的指针值。
内容单元:
Sec_01_VM如何加载SO模块
Sec_02_Java与C函数可以直接互相调用吗
Sec_03_VM如何创建JNIEnv的对象
Sec_04_透过JNIEnv对象来使用VM的函数表
Sec_05_有效化解线程冲突的问题呢
Sec_06_C函数之间如何共享数据呢
Sec_07_线程之间如何共享数据呢
Sec_08_在C函数里创建小线程
~ End ~