在Java里面调用so动态库的方法
1、引入jna依赖
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna-platform</artifactId>
<version>5.3.1</version>
</dependency>
2、编译好so文件放到/usr/local/下面
3、映射类
package cn.caict.bifchain.api;
import com.sun.jna.Library;
import com.sun.jna.Native;
/**
* @ Version: 1.0
* @ Time: 2022/10/25 16:53
* @ Description:
*/
public class SoUtil {
/**
* so库映射的接口
*/
private interface NativeCpp extends Library {
/**
* 映射的方法
*
* @param param
* @return
*/
String sendHashToMsgQueue(String param);
}
/**
* 加载so库
*/
private static class SoLibImpl implements NativeCpp {
static NativeCpp INSTANCE;
static {
try {
// 也可以采用其他方法加载so库文件,或将so文件放在项目中
INSTANCE = (NativeCpp) Native.synchronizedLibrary(Native.loadLibrary("/usr/local/libjava_c.so", NativeCpp.class));
System.out.println("Load SoLib success");
} catch (Exception e) {
// 异常处理
INSTANCE = null;
System.out.println("so库[/usr/local/libjava_c.so]加载失败!");
}
}
@Override
public native String sendHashToMsgQueue(String param);
}
/**
* 对外暴露的工具方法,在此方法中调用so库中的native方法
*
* @param param
* @return
*/
public static String invoke(String param) {
if (null != SoLibImpl.INSTANCE) {
return SoLibImpl.INSTANCE.sendHashToMsgQueue(param);
} else {
throw new RuntimeException("无法执行native方法,请检查so库文件是否存在!");
}
}
}
4、调用
SoUtil.invoke(入参);
如果报错找不到方法
java.lang.UnsatisfiedLinkError: Error looking up function
查看编译的so方法名是否跟java类里的方法名一样,错误参考:https://blog.csdn.net/DeliaPu/article/details/109495470
本文介绍了在Java中调用so动态库的方法,包括引入jna依赖、将编译好的so文件放到指定目录、创建映射类并进行调用。同时,针对可能出现的找不到方法的报错,给出了查看编译的so方法名与Java类方法名是否一致的解决建议,并提供了错误参考链接。
602

被折叠的 条评论
为什么被折叠?



