一系列的问题 虽然还没有解决 先总结一下
首先加载到动态链接库,再把库中对应的方法映射到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加载,待解决……