JNI Java调用so包相关问题总结

来源:互联网 发布:国家网络应急中心考试 编辑:程序博客网 时间:2024/04/28 23:35

一系列的问题 虽然还没有解决 先总结一下

首先加载到动态链接库,再把库中对应的方法映射到java中的本地方法

一般格式如下

public class Test{    private native void hello();    public static void main(String[] args){        System.loadLibrary("Test");        Test test = new Test();        test.hello();    }}

这里使用System.loadLibrary("XXX") 来加载动态链接库,不需要使用.so后缀。

然而这样运行一般都会出现加载不到库的错误,原因是java默认从java.Library.path 中加载,一般默认的java.Library.path/usr/lib,因此解决方法可以是将需要的so包放入/usr/lib目录下,但是这种解决方法肯定不好。

还有一种方法是配置环境变量

LD_LIBRARY_PATH=/....export LD_LIBRARY_PATH

不过这种方法也有局限性,一般线上的环境是没有权限的。

方法三,使用JVM参数指定java.Library.path,如下:

java -Djava.library.path=/jni/library/path Test 

这种方法也不是很好,因为不可能每次运行的时候都手动设置,如果本机运行的话,使用IDEA,可以考虑在VM Options中配置还比较方便

方法四,在程序中设置java.Library.path

System.setProperty("java.library.path", "/jni/library/path")

但是此方法无效,原因是java.library.path只有在JVM启动的时候读取一次

方法五,直接使用绝对路径加载动态链接库

public class Test{    private native void hello();    public static void main(String[] args){        System.load("/home/lib/Test.so");        Test test = new Test();        test.hello();    }}

注意这样的话就需要使用.so后缀

这里还是会出现加载不到库的问题,百度了一下说是没有使用JNA加载,待解决……

原创粉丝点击