微课名称:

     细说JNIVM之关系

 

wKioL1XajBbAcN7mAAEQ-s6tAHQ508.jpg立即学习此微课:

 

微课目标:

   在Android环境里,定义了两个主要的类别(或C的结构):JavaVM和JNIEnv。每一个进程只诞生一个VM实例,所以只有一个JavaVM对象。每一个线程(Thread)第一次进入VM调用本地函数时,VM会替它诞生一个相对映的JNIEnv对象。JNIEnv对象内含一个指针,正指向VM的函数表(Function Table)。于此,细说JNI与VM的密切关系。

  

微课介绍

    由于可以共享JavaVM对象指针,所以通常在VM加载*.so程序库时,会先调用JNI_OnLoad()函数,此刻就将JavaVM对象指针值储存于CJNI模块里的全局(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 ~