1. 生成so库问题
- 已有c文件如下图
2 - 在利用 cpp或者c 文件生成 so库时,切记将需要接口调用的方法 前加上
extern "C"
,(如果是dll库的话,这里应为:extern "C" __declspec(dllexport)
)如下图
- 在 linux 中,cpp文件的同级目录下,打开终端窗口运行下面命令
g++ Flow1D.cpp files.cpp -fpic -shared -o libflowd.so
就会生成so库。
2. java 接口以及路径问题
因为是将项目打包成jar包在Linux服务器上运行,关于路径问题折腾了好久,最终我的是这样的。
- 将jar包需要读写的文件放到与jar包的同级目录下,如下图
在DAT中,so文件即为so库,07文件夹中为其他的输入输出文件
- 编写java类加载动态链接库并写接口
其中:System.getProperty(“user.dir”) 获取当前jar包所在的绝对路径
注意:在Linux环境下,路径均为 / ,同时,我是直接通过路径加载了so库,就不需要配置环境变量什么的了。
public interface Clibaray extends Library {
//加载动态链接库
Clibaray INSTANCE = (Clibaray)Native.loadLibrary(
System.getProperty("user.dir")+(Platform.isWindows()?"/DAT/flowd.dll":"/DAT/libflowd.so"),Clibaray.class);
//对应库中的接口方法,注意参数的对应关系:java和c语言
void test1(String path);
}
- 把jar包和 DAT文件一起复制到Linux中,运行就可以了
参考:
JNA调用C++的相关点总结
Maven学习笔记(十二)-maven打包之resource配置
关于在打包Jar文件时遇到的资源路径问题(二)