美文网首页
JNA so类库调用及char*的处理方法

JNA so类库调用及char*的处理方法

作者: 宋雾代 | 来源:发表于2019-02-15 09:26 被阅读0次

一个功能需要对数据进行处理,处理的程序是用C写的so库,需要用java程序去调用。在研究了整整两天以后,完成了功能。遇到的问题记下来给大家参考。

一开始打算使用JNI,但是由于so库是事先编译好,无法为java定制,所以放弃改用更加灵活的JNA框架。

  1. so库的位置问题

当然可以吧so文件放在/usr/lib下面但是由于现实情况文件位置不确定,所以需要配置。

解决方法:在程序开头调用 NativeLibrary.addSearchPath(库名,库文件所在目录);

  1. so库的名称

在linux下 如so文件为libtest.so 则名称为test,不包含lib和扩展名

  1. 关于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;
}

相关文章

网友评论

      本文标题:JNA so类库调用及char*的处理方法

      本文链接:https://www.haomeiwen.com/subject/fofkeqtx.html