最近做一个功能是使用jna方式去调用so包里面的方法
问题:
1、so包一定满足是linux下的,区分32还是64位
2、window下是dll文件,也是区分32还是64位
1、pom文件
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna</artifactId>
<version>5.5.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/net.java.dev.jna/jna-platform -->
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna-platform</artifactId>
<version>5.5.0</version>
<exclusions>
<exclusion>
<artifactId>jna</artifactId>
<groupId>net.java.dev.jna</groupId>
</exclusion>
</exclusions>
</dependency>
2 、创建java文件继承Library
public interface FaceLibraryNew extends Library {
//我这里使用的是绝对路径
public String soAddress="so包的地址";
FaceLibraryNew INSTANTCE = (FaceLibraryNew) Native.load(soAddress, FaceLibraryNew.class);
//这是一个String类型的参数
public class GoString extends Structure {
public static class ByValue extends GoString implements Structure.ByValue {}
public String p;
public long n;
@Override
protected List getFieldOrder(){
return Arrays.asList(new String[]{"p","n"});
}
}
/**
* @param img_path
* @return
*/
public String Detect(GoString.ByValue img_path);
}
3、调用方式
//初始化
FaceLibraryNew faceLibraryNew;= FaceLibraryNew.INSTANTCE;
//调用内部方法,参数
FaceLibraryNew.GoString.ByValue recognize = new FaceLibraryNew.GoString.ByValue();
recognize.p = recognizeImg;
recognize.n = recognize.p.length();
//so包中的方法
String detectRes = faceLibraryNew.Detect(recognize);