记录一下System.loadLibrary和System.load

主要是工作和硬件打交道过.而且公司用的JNI.然后dll就在工程根目录很多

想封装一下.那某些库要用的jni封装到那个库里面.

遂试了一下.

static

{

System.loadLibrary("a")

}

如果把a和a的依赖bcdef全部放在工程根目录.能够正常加载

但是如果在工程根目录新建一个叫dll的dir

然后通过-Djava.library.path=SRC_ROOT/dll

这样.就会报hs_err.虚拟机直接崩溃了.

说明应该是依赖没找到

但是我把dll的名字改成dll2

去启动就报no ain java.library.path

那说明其实参数设置是有效的啊

我就奇怪了.这个a的依赖他到底是不是有java层面的libraryPath去找的.

因为dll的加载都是在classLoad

NativeLibrary lib =newNativeLibrary(fromClass,name,isBuiltin);

nativeLibraryContext.push(lib);

try{

lib.load(name,isBuiltin);

}finally{

nativeLibraryContext.pop();

}

if(lib.loaded) {

loadedLibraryNames.addElement(name);

libs.addElement(lib);

return true;

}

static classNativeLibrary {

// opaque handle to native library, used in native code.

longhandle;

// the version of JNI environment the native library requires.

private intjniVersion;

// the class from which the library is loaded, also indicates

// the loader this native library belongs.

private finalClassfromClass;

// the canonicalized name of the native library.

// or static library name

Stringname;

// Indicates if the native library is linked into the VM

booleanisBuiltin;

// Indicates if the native library is loaded

booleanloaded;

native voidload(String name, booleanisBuiltin);

是个native方法.我就怀疑是不是jvm这B.根本没有管这个参数?

但是网上大佬都说可以啊..

我迷了.

更新一下...

吧-Djava.library.path=SRC_ROOT/lib 写在-jar前面就行了..

但是如果a.dll 依赖了b.dll. 然后把a.dll和b.dll都放在了 src_root/lib下面.

你使用的时候是System.loadLibrary("a")的话.不出意外会给你报

Can't find dependent libraries

关于这个我看了一下jvm的代码


有这么一段注释.我觉得这就说明了java根本不管你设置的..

java -Djava.library.path=src_root\lib -Djava.ext.dirs=$JAVA_HOME\jre\lib\ext;src_root\lib -jar aa.jar

这样都不行..

但是idea通过设置working_directory确实是可以做到这种效果的

我去找找idea或者eclipse是如何做到的..能找到再来更新.

你可能感兴趣的:(记录一下System.loadLibrary和System.load)