一个功能需要对数据进行处理,处理的程序是用C写的so库,需要用java程序去调用。在研究了整整两天以后,完成了功能。遇到的问题记下来给大家参考。
一开始打算使用JNI,但是由于so库是事先编译好,无法为java定制,所以放弃改用更加灵活的JNA框架。
- so库的位置问题
当然可以吧so文件放在/usr/lib下面但是由于现实情况文件位置不确定,所以需要配置。
解决方法:在程序开头调用 NativeLibrary.addSearchPath(库名,库文件所在目录);
- so库的名称
在linux下 如so文件为libtest.so 则名称为test,不包含lib和扩展名
- 关于char*的调用方法
因为用到的函数char*参数既是传入又是传出。
如果用String的话传入没问题但是由于String类型只读,所以无法传出。
网上查了很多有说byte的 有说其他的
最后实验成功的方法如下:
Memorymem = new Memory(1024);
mem.clear();
men.setString(0, str);
然后传入mem就可以了。
最后附上完整的java实现demo
public interface Test extends Library {
Test INSTANCE = (Test)Native.loadLibrary("test",Test.class);
int do(Pointer a);
}
NativeLibrary.addSearchPath(libname,libpath);
Memory mem = new Memory(1024);
mem.clear();
mem.setString(0,str);
if(Test.INSTANCE.do(mem)==0){
return mem.getString(0).trim();
}else{
return null;
}