Java使用JNI调用动态链接库(Mac版)

1. 在不同系统中,动态库和静态库的命名方式:

 (1) .dll .obj .lib使用在windows平台下。

​ .dll:动态链接库,作为共享函数库的可执行文件。 .obj:目标文件,相当于源代码对应的二进制文件,未经重定位。 .lib:可理解为多个.obj的集合。(静态连接库)

​ (2) .so .o .a使用在linux平台下。

​ .so:(share object)动态链接库,跟Windows平台类似。 .o: 目标文件,相当于源代码对应的二进制文件。 .a:多个.o的集合。(静态连接库)

​ (3).dylib .o .a使用在macOS系统下。

.dylib:(share object)动态链接库,跟Windows平台类似。 .o: 目标文件,相当于源代码对应的二进制文件。 .a:多个.o的集合。(静态连接库)

静态链接库一般在编译期间就确定了,动态链接库生成以后可以供Java调用。使用JNI调用C/C++生成的动态链接库,以此来实现一些使用C/C++开发的优秀的代码。

2.环境:

​ Macos(我的是M1芯片),Gcc编译器(M1版本),Java1.8版本(OpenJdk_Zulu)。

3.生成.dylib

  1)先要有.c和.h文件,以sqlite3.c和sqlite3.h为例子

  2)通过脚本生成.dylib

#需要修改jdk的路径
javaSDKPath=/Library/Java/JavaVirtualMachines/jdk1.8.0_291.jdk/Contents/Home
#文件名字
libPrefix=libsqs_interface_acp6
libFile=$libPrefix.dylib
cd /
cd /Users/aiait/Documents/workspace/webC/indo_quotation_project/dll-project2_win64/macFile
#删除以前已经存在的.o文件
rm -fvr $libPrefix
#.c文件生成.o文件
gcc -DWEB_LINUX=1 -DTUNE=1 -I$javaSDKPath/include -I$javaSDKPath/include/darwin -I"./src" -c ../src/sqlite3.c
#gcc -DWEB_LINUX=1 -DTUNE=1 -I$javaSDKPath/include -I$javaSDKPath/include/darwin -I"./src" -c ../src/xxx.c
#创建文件夹
mkdir $libPrefix
#移动所有的.o文件到libsqs_interface_acp6
mv *.o $libPrefix
#.o文件生成.dylib文件
gcc -shared -o $libFile ./$libPrefix/sqlite3.o  -DWEB_LINUX=1
#多个.o文件生成一个.dylib文件可以直接在后面叠加
#gcc -shared -o $libFile ./$libPrefix/sqlite3.o  ./$libPrefix/xxx.o  -DWEB_LINUX=1

 4.将生成的.dylib放到java项目的加载目录下

将.dylib文件放到下面打印出来的路径下即可加载成功。

String aa[]=System.getProperty("java.library.path").split(";");
for (int i = 0; i < aa.length; i++) {
    System.out.println(aa[i]);
}

 Java使用JNI调用动态链接库(Mac版)_第1张图片

 如果想添加自己的路径需要配置环境变量。

export JAVA_LIBRARY_PATH=$LD_LIBRARY_PATH:/Users/aiait/Documents/JniFile

Java使用JNI调用动态链接库(Mac版)_第2张图片

Java使用JNI调用动态链接库(Mac版)_第3张图片

 5.启动java项目报错

   mach-o but wrong architecture

​  这个问题主要是因为Gcc使用的arm64的,jdk使用的是x64的,所以在执行 java代码的时候就会  出现这个错误的架构的问题。将x64的JDK修改为ARM的JDK就行了(OpenJdk_Zulu)。

https://www.oracle.com/cn/java/technologies/javase/javase-jdk8-downloads.html

Java Download | Java 8, Java 11, Java 13 - Linux, Windows & macOS

 6.java项目启动成功

参考资料:(10条消息) Java使用JNI调用动态链接库(Mac版)_TankyZhang的博客-CSDN博客

你可能感兴趣的:(jni,java)