JNI 是Java提供的调用native本地方法的编程接口,可以实现对其它非java语言(C,C++)编写的接口的调用。
可能使用到的场景有:
- 标准的java类库没有提供你的应用程序所需要的功能,通常这些功能是平台相关的
- 你希望使用一些已经有的类库或者应用程序,而他们并非用java语言编写的
- 程序的某些部分对速度要求比较苛刻,你选择用汇编或者c语言来实现并在java语言中调用他们
Java代码如下
package studyJNIMain;
public class Main {
static {
System.out.println(System.getProperty("java.library.path"));
System.loadLibrary("test");
}
public static void main(String[] args) {
Main m=new Main();
m.test(1);
}
native public int test(int in);
}
System.loadLibrary是用来加载动态库的,必须放在stack{}语句块中。
调用步骤如下:
1.编写java代码,编译生成main.class。
2.打开命令行,进入到存放class文件的根目录,使用命令javah -jni studyJNIMain.Main。会生成一个studyJNIMain_Main.h文件。打开该头文件,我们会发现定义了一个方法 Java_studyJNIMain_Main_test(JNIEnv *, jobject, jint);
#include <jni.h>
/* Header for class studyJNIMain_Main */
#ifndef _Included_studyJNIMain_Main
#define _Included_studyJNIMain_Main
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: studyJNIMain_Main
* Method: test
* Signature: (I)I
*/
JNIEXPORT jint JNICALL Java_studyJNIMain_Main_test
(JNIEnv *, jobject, jint);
#ifdef __cplusplus
}
#endif
#endif
3.利用vc编写test.dll。选择new->projects(选择Win32 Dynamic-Link Library)->OK->An ampty DLL project->Finish。
4.把studyJNIMain_Main.h加载到项目当中,创建test.cpp包含studyJNIMain_Main.h头文件,实现Java_studyJNIMain_Main_test(JNIEnv *, jobject, jint)方法就行了,编译生成动态库test.dll。
5.把test.dll放在System.getProperty("java.library.path")获取的地址当中,运行mian。