一、简介
Java Native Interface(JNI),java与c/c++交互的接口,下面是一个简单是示例。
javah 可以生成native方法对应的头文件,javap 可以查看方法或者属性的签名。
二、示例
1、书写带native的java代码
package com.jni;import java.util.Date;//javah com.jni.Hello//com_jni_Hello.hpublic class Hello { public int property; //javap -s com.jni.Hello //(ILjava/util/Date;[I)I public int function(int foo,Date date,int[] arr){ System.out.println(foo+"="+date+""+arr); return 0; } public native void hello(); public static void main(String[] args) { System.loadLibrary("nativeCode"); Hello hl = new Hello(); hl.hello(); }}
2、通过javah生成头文件com_jni_Hello.h
javah com.jni.Hello
3、通过javap查看方法和属性签名
javap -s com.jni.Hello
4、在vc或者vs中新建DLL工程(工程名为vativeCode),加入生成的头文件到工程中,如果有缺失的依赖头文件,到jdk目录(%java_home%\include)下找到,一起加入工程
5、书写C/C++代码(.cpp文件中)
#include"com_jni_Hello.h" #includeusing namespace std; JNIEXPORT void JNICALL Java_com_jni_Hello_hello(JNIEnv * env, jobject obj) { cout<<"hello native"< GetObjectClass(obj);//获取class jfieldID field_prop = env -> GetFieldID(hello_clazz,"property","I");//通过属性名和签名获取属性 jmethodID methodId_func = env->GetMethodID(hello_clazz,"function","(ILjava/util/Date;[I)I");//获取方法 env->CallIntMethod(obj,methodId_func,0L,NULL,NULL);//执行 }
6、运行DLL工程生成dll文件(nativeCode.dll)配置dll文件到环境变量中
7、运行java代码
hello native 0=nullnull