Linux下Java通过JNI调用C++
以下为Demo流程
1.创建Java文件
public class HelloWord {
// 声明本地方法
public native void sayHello();
static {
// 加载本地库
System.loadLibrary("hello");
}
public static void main(String[] args) {
new HelloWord().sayHello();
}
}
2.编译生成.h头文件
在HelloWord.java所在文件夹中打开终端,使用java命令编译.java文件,生成.h文件
/data/home/UOS/IDEA/jdk/jdk21/bin/javac -h . HelloWord.class
/data/home/UOS/IDEA/jdk/jdk21/bin/javac 为指定jdk所在路径,此时可在文件夹中生成.h文件
文件具体内容如下:
3.创建编写.c文件具体功能代码
4.生成libhello.so文件
完成3之后,在HelloWord.c所在文件夹下使用gcc编译生成.so文件,具体命令如下
gcc -shared -fPIC -o libhello.so -I/data/home/UOS/IDEA/jdk/jdk21/include -I/data/home/UOS/IDEA/jdk/jdk21/include/linux HelloWord.c
5.指定so文件路径,执行程序
可以使用Java命令指定java程序加载.so,我这里使用的是指定.so程序的全路径。
public class HelloWord {
// 声明本地方法
public native void sayHello();
static {
// 加载本地库
//System.loadLibrary("hello");
//System.loadLibrary(LIB_PATH);
Path currentRelativePath = Paths.get("");
String absolutePath = currentRelativePath.toAbsolutePath().toString();
String libPath = Paths.get(absolutePath, "/src/main/java/hc/smart/jni/libhello.so").toString();
System.out.println(libPath);
System.load(libPath);
}
public static void main(String[] args) {
new HelloWord().sayHello();
}
}
执行后即可输出Hello. World
其中System.load(libPath);为加载全路径.so文件方法;若使用System.loadLibrary("hello");则需使用java命令配置.so。
若更改.c文件中的代码,则需重新编译生成.so文件,方可执行最新功能
后续将实现更复杂的功能