在使用Java JNI的时候,往往需要在程序启动前设定"java.library.path"
1. 在终端情况下,java -Djava.library.path=/path/to/libs
2. 在IDE情况下,如Eclipse: Project->Properites->Java Build Path -> Source, 然后设定Native library location
注意:之后改变system properties,没有效果, 因为当程序启动时,已经缓存了system properties, 程序每次读取的属性都来自这个缓存。
System.setProperty( "java.library.path", "/path/to/libs" );
Field fieldSysPath = ClassLoader.class.getDeclaredField( "sys_paths" );
fieldSysPath.setAccessible( true );
fieldSysPath.set( null, null );
解释:
Classloader有一个叫做"sys_paths"的静态属性, 它包含了system properties的路径 (这个路径被赋值当程序启动的时候)。我要这里要做的就是,把这个属性置空, 这样当我们调用loadLibrary的时候, 因为system properties"没有被初始化", Classloader就会把我们的期望的路径("/path/to/libs")设定成功啦。
本文翻译出处 点击打开链接