Java本机接口
Java本机接口(Java Native Interface,JNI)是供JVM调用本地动态链接库中方法的机制,一些计算密集的代码,可以转移到C++实现,速度会快很多,而一些硬件通信的功能也只能依靠JNI来实现。但是JNI会破坏Java的跨平台特性,而且数据在JVM和本机之间的通信过程也会一定程度上拖慢速度。
1 DLL调用
Java代码中,本地代码的入口需要单独放在一个类中,作为静态函数使用,声明为native方法,如:
然后编写C++实现代码:
jni.h(位于JDK安装目录下的include文件夹)中提供了JNI数据类型的定义。注意函数名必须为Java_类命名空间_类名_方法名的形式,第1、2个参数必须分别为JNIEnv和jobject类型,其它参数和Java代码中的声明保持一致。如果用C++编译器,必须以C语言规则导出这些函数。
2 字符串
C/C++的字符串默认是MBCS编码的,而Java默认是UTF-16编码,且位于JVM的托管空间下,因此必须进行一个转换。如下代码创建Java字符串:
而下面的代码读取从JVM中传入的字符串。注意,传入的字符串需要复制后才能使用,这个副本需要在本机代码中释放内存!
3 数组
本机代码中不能为Java数组申请内存,只能修改其内容,必须由JVM创建并传入本机代码。Java用jarray代表所有类型的数组,由于Java中所有的数据都是对象,所以jintArray和jarray实际上是同一个东西。首先使用JNIEnv::GetArrayLength获取数组长度,然后用SetXXXArrayRegion设定XXX类型数组的值: