项目场景:
最近项目需要开发一个新功能,需要调用c++的so文件,在实际开发过程中碰到了一些问题,记录一下。
文章目录
- 项目场景:
- 一、使用技术
- 二、使用步骤
- 1.编写一个类用于解析so文件
- 2.项目部署
- 3.注意事项(可能出现的错误)
- 3.1版本不一致
- 3.2 运行环境
- 3.3 没有配置动态链接库地址(LD_LIBRARY_PATH)
- 3.4 文件名
- 3.5 函数名不正确
- 总结
一、使用技术
原本是想直接用jna的,但是我们硬件提供的so文件用jna一直调用不到,于是就打算使用java自带的jni来调用。此项目无法在Windows环境下运行,只能在Linux环境。
二、使用步骤
1.编写一个类用于解析so文件
代码如下:
package com.sunson.driver;
public class dukpt {
public native String generateUnlockCode(String A, String B);
static{
System.loadLibrary("dukpt");
}
}
注意此处的包名,需要和so文件的头相同,所以必须创建相同的包名以及类名。
2.项目部署
1.将so文件保存在Linux系统,我保存的路径和之前类的包名是一样的(好像保存路径可以和包名的地址不一致,我没有尝试)。
2.使用 export LD_LIBRARY_PATH= so文件的地址 命令指定动态链接库,如果没有指定的话,会找不到so文件。
我的系统的默认路径实在usr/local/lib,但是我把so文件放在下面还是找不到。
export 命令只是在当前这次登录下有效,如果重新打开了xshell还得重新再设置一遍。如果不想每次都设置,可以将该 LD_LIBRARY_PATH 的 export 语句写到系统文件中,例如 /etc/profile、/etc/export、~/.bashrc 或者 ~/.bash_profile 等等,这取决于你正在使用的操作系统。
可以使用echo $LD_LIBRARY_PATH
查看地址。
3.运行你的项目
成功运行!
3.注意事项(可能出现的错误)
3.1版本不一致
可以在Linux环境下使用file [文件名]
来查看当前so文件的版本是不是和当前系统一致。
`
3.2 运行环境
我在Windows环境是一直都调不起来,试了Jna框架在Windows环境下也是运行不了。
错误代码:
java.lang.UnsatisfiedLinkError: no dukpt in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1867)
at java.lang.Runtime.loadLibrary0(Runtime.java:870)
at java.lang.System.loadLibrary(System.java:1122)
at com.sunson.driver.dukpt.<clinit>(jdukptTest.java:7)
Exception in thread "main"
Process finished with exit code 1
3.3 没有配置动态链接库地址(LD_LIBRARY_PATH)
可以使用echo $LD_LIBRARY_PATH
查看地址。
如果没有指定的话,
.使用 export LD_LIBRARY_PATH= so文件的地址
命令指定动态链接库
3.4 文件名
生成的so文件是lib前缀的,在java解析时文件名不用加lib,运行时自动会加上lib。
3.5 函数名不正确
可以使用nm [文件名]
查看so文件中的函数名和Java中调用的函数名是否一致。
主要是.h文件中没有加extern "C"
导致函数名会加上前缀。
总结
以上就是今天要讲的内容,本文仅仅简单介绍了Java对so文件的调用,不同的so文件可能操作会不一样,之前下载了一个实例进行测试,没有修改任何地方,单纯的跑了一下,结果也能成功调用。但是当调用公司提供的so文件时就一直在出错。错误还得看具体的代码,以上列出的只是我碰到的一些问题。