JNI
一、 概念介绍
JNA(Java Native Access )提供一组Java工具类用于在运行期动态访问系统本地库(native library:如Window的dll)而不需要编写任何Native/JNI代码。开发人员只要在一个java接口中描述目标native library的函数与结构,JNA将自动实现Java接口到native function的映射。Jna是jai的实现。
JNI是JAVA标准平台中的一个重要功能,它弥补了JAVA的与平台无关这一重大优点的不足,在JAVA实现跨平台的同时,也能与其它语言(如C、C++)的动态库进行交互,给其它语言发挥优势的机会。
有了JAVA标准平台的支持,使JNI模式更加易于实现和使用。
二、 编写JAVA类
方法需要时 native的;
三、 生成头文件
使用javah可以将native的方法转为C++实现的头文件。
以文件 “D:\workspace\testP\scr”下com包内的Jni_test为例:
package com;
public class Jni_test {
private native final void init();
private native final void init2(int a,int b);
}
3.1. 编译类
可以通过编译工具,生成对应的class类;或者是使用javac 编译;
3.2. 使用javah生成头文件
D:\workspace\testP\src>javah -classpath D:\workspace\testP\bin -d d:/ -jni com.Jni_test
其中java中:
-classpath 用于装入类的路径,也就是class 所在的根目录
-d 输出目录
-jni 生成 JNI样式的头文件(默认)
注意执行文件的位置为src下;
会生成以下划线分割的包名和类名的结合字符串命令的头文件 com_Jni_test.h
3.3.
常见问题
常见错误是指定运行的路径不对
例如-classpath 指定的位置
不是bin下,就会报找不到的类的错误;
四、
实现dll
环境配置
·将上一步骤产生的h文件,导入到vs中;为了使此类h文件能够编译通过,需要将jni相关的头文件导入到安装目录的Include目录中,jni.h在JDK安装目录下的include中,同时得件include/win32中的两个头文件jawt_md.h、jni_md.h也导入。
参考:
·创建项目的时候需要dll的项目,在项目属性中配置类型改为动态都库
数据类型对应
在不同语言之间需要对不同数据类型之间做对应映射;
像booleans、integers、floats等从Java程序中传到本地方法中的原始类型可以直接使用,下面是java中的原始类型和本地方法中的类型的对应:
Java类型
本地类型
描述
boolean
jboolean
C/C++8位整型
byte
jbyte
C/C++带符号的8位整型
char
jchar
C/C++无符号的16位整型
short
jshort
C/C++带符号的16位整型
int
jint
C/C++带符号的32位整型
long
jlong
C/C++带符号的64位整型e
float
jfloat
C/C++32位浮点型
double
jdouble
C/C++64位浮点型
Object
jobject
任何Java对象,或者没有对应java类型的对象
Class
jclass
Class对象
String
jstring
字符串对象
Object[]
jobjectArray
任何对象的数组
boolean[]
jbooleanArray
布尔型数组
byte[]
jbyteArray
比特型数组
char[]
jcharArray
字符型数组
short[]
jshortArray
短整型数组
int[]
jintArray
整型数组
long[]
jlongArray
长整型数组
float[]
jfloatArray
浮点型数组
double[]
jdoubleArray