用jna调用liunx的.so库。或者windows的.dll库
pom增加jna引用包:
<dependency>
<groupId>com.sun.jna</groupId>
<artifactId>jna</artifactId>
<version>3.0.9</version>
</dependency>
引用完成,把对应的.so或者.dll库放到系统文件目录。liunx的目录是:/usr/lib64;windows的目录是:C:\Windows\System32;
liunx的.so文件开头以lib开头
准备工作做好之后,进行java代码编写,实现调用.so库里的方法:
新建类写方法,我为了避免每次调用都加载库,放在静态方法里。项目启动就完成加载。
核心代码是 **Native.loadLibrary(“jcAPI”,CLibrary.class);**这里注意,需去除文件的lib前缀。
public class ApiService {
private static CLibrary lib = null;
/**
* 静态加载.so库
*/
static {
String systemType = System.getProperty("os.name");
String ext = (systemType.toLowerCase().indexOf("win") != -1) ? ".dll" : ".so";
if(ext.equals(".so")) {
try {
lib = (CLibrary)Native.loadLibrary("jcAPI",CLibrary.class);
// lib = (CLibrary) Native.load("jcAPI", CLibrary.class);
} catch (Exception e) {
System.out.println("加载so库失败");
}
}
}
}
加载完成,编写和.so库相同命名的方法名和参数的接口
.h文件提供的方法如下图:
java接口代码如下:和.h文件方法名一样。char* 对应的是java的String类型。其他c++类型对应的Java数据类型,如下图:
import com.sun.jna.Library;
/**
* 此接口和C里方法一模一样.h文件
* 不可自己定义
*/
public interface CLibrary extends Library{
String GenWallet(int a);
String GenSign(String pri,String msg,int leng);
}
C++和Java类型对应
主方法调用:
String hash = "b4adfa844fb516906bb3b50f879700d75a9fe49add88e5730489971d9e6a764f";
String priKey = "fa0a059eece8222586a59f67b546bfae14ff72596d71ed8ec59b4c06d34fc3b4";
String a = lib.GenSign(priKey,hash,hash.length());
System.out.println("a=" + a);
是否有输出数据,有输出说明方法调用成功。