一、关于JNI
JNI是Java Native Interface的缩写,JNI是JAVA平台专门用于和本地C代码进行相互操作的API,称为JAVA本地接口。
二、JNI开发流程
- 1.在JAVA中先声明一个native方法。
- 2.通过javac -h或javah -jni命令导出JNI使用的C头头文件。
- 3.使用C实现本地方法。
- 4.将本地代码变异成动态库,windows下是.dll文件,linux下是.so文件。
- 5.在JAVA程序中加载步骤4中生成的类库,执行JAVA程序,最终实现JAVA本地代码。
三、示例
1.使用native创建一个本地方法
package com.test;
public class TestJni {
static {
System.load("/path/to/libtest.so"); // 替换为实际的动态链接库文件路径
}
private static native int test(String inputPath, String outputPath);
public static void main(String[] args) {
int result = test("aa", "bb");
if (result == 0) {
System.out.println("0");
} else {
System.out.println("非0");
}
}
}
2. 使用javac -h生成头文件
两种方式:
1)用javac生成class和c头文件
javac -h F:\workspace2\testShell\src\main\java\com\test TestJni.java -encoding UTF-8
2)用javah生成c头文件
javah -jni -encoding UTF-8 -classpath F:\workspace2\testShell\src\main\java com.test.TestJni
生成后的c头文件如下:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_test_TestJni */
#ifndef _Included_com_test_TestJni
#define _Included_com_test_TestJni
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_test_TestJni
* Method: test
* Signature: (Ljava/lang/String;Ljava/lang/String;)I
*/
JNIEXPORT jint JNICALL Java_com_test_TestJni_test
(JNIEnv *, jclass, jstring, jstring);
#ifdef __cplusplus
}
#endif
#endif
需要自行修改加上参数变量名称
写c文件
3.在linux下,编写该C代码的动态库
gcc -fPIC -I/opt/ctools/jdk1.8.0_301/include/ -I/opt/ctools/jdk1.8.0_301/include/linux/ -shared -o libTestJni.so TestJni.c
4.调用
修改如下编译生产的库文件路径,就可执行java代码调用了。