作用:使Java能够同C/C++动态库(dll)进行交互。
编写过程:
1、native接口类,其中方法用native修饰,没有方法体。
2、通过javah命令编译native接口类,会生成.h的头文件。
3、用C编写一个dll文件
(1)需要引入刚生成的.h头文件
(2)实现头文件中的方法(会对应到native接口类中的方法)。
(3)方法中正常调用dll文件即可。
4、特殊变量的参数和返回值,使用方式可以参看jni.h中的java类型与c类型转换的相关方法。
代码例子:
native接口类:
public class DLLSchema {
/* 参数和返回值可以根据需要 */
public native int test (int param);
}
程序调用方式:
public class DLLCall {
static {
/* 加载DLL文件,不用加后缀名 */
System.loadLibrary("dll");
}
public void call() {
DLLSchema dll = new DLLSchema();
int result_int = dll.test(100);
}
}
javah:
命令:javah test.DLLSchema
编译后会生成一个 test_DLLSchema.h 的文件:
C部分调用:
#include <stdio.h>
#include <Windows.h>
#include "com_loong_demo_jni_DLLSchema.h"
// 加载指定dll
HINSTANCE Hint = ::LoadLibrary("dll.dll");
// 实现方法体
JNIEXPORT jint JNICALL Java_test_DLLSchema_test(JNIEnv *, jobject, jint param) {
// 新建函数类型
typedef int (*TEST)(int param_);
// 获取调用函数
TEST _test = (TEST)GetProcAddress(Hint,"TEST");
// 调用函数
int result = _test(param);
return result;
}