因为网上大部分是java调用c或者c++的文章较多,所以写一个留个念想。
还是直接上代码再来解释
1 | static JavaVM* g_JavaVM = NULL; |
唯一需要解释的只有两个地方
第一个就是在NDK中创建的线程中, 只允许调用静态的Java API,只能使CallStaticVoidMethod
第二个就是JNI_OnLoad,在这里把JavaVM指针保存下来
重新改方法时,java会先调用该组件的JNI_OnLoad()函数.其用途有二:
一是:告诉java VM此C组件使用那一个JNI版本。如果你没有提供JNI_OnLoad()函数,VM会默认使用最老的JNI 1.1版本。由于新版的JNI做了许多扩充,如果需要使用JNI的新版功能,例如JNI 1.4的java.nio.ByteBuffer,就必须藉由JNI_OnLoad()函数来告知VM。
二是:由于VM执行到System.loadLibrary()函数时,就会立即先呼叫JNI_OnLoad(),所以C组件的开发者可以藉由JNI_OnLoad()来进行C组件内的初期值之设定,也就是获取JavaVM接口。
唯一需注意的就是一定小心内存泄露的问题,java代码如果写多了,也许会不太适应