我加载库到我的Java代码。 我已经把库中的系统正32文件夹,我还设置-Djava.library.path。
早些时候,该代码正在运行
try{
System.loadLibrary("resources/TecJNI");
System.out.println("JNI library loaded \n");
}
catch(UnsatisfiedLinkError e){
System.out.println("Did not load library");
e.printStackTrace();
}
但自上周以来,它显示
java.lang.UnsatisfiedLinkError: no resources/TecJNI in java.library.path.
这是我在Java代码或DLL加载我一些其他应用程序所使用的DLL文件的一些权限问题。
也用上了与装载在不同的工作区相同的dll的所有其他我运行的应用程序没有正在运行。
谁能给我建议?
编辑:我使用 -
Djava.library.path = “$ {} workspace_loc /org.syntec.ivb.application/resources; $ {ENV_VAR:PATH}”
在我的Eclipse VM参数。 我认为这是用这个。
预计的System.loadLibrary库名称,而不是一个路径。 以方含该库的目录的路径应该在PATH(Windows)中环境变量或-Djava.library.path设置
当谈到加载库在JVM中,我喜欢的库复制到一个临时目录,然后将临时目录中加载它们。 这里是代码:
private synchronized static void loadLib(String dllPath,String libName) throws IOException {
String osArch = System.getProperty("os.arch").contains("64")?"_X64":"_X86";
String systemType = System.getProperty("os.name");
String libExtension = (systemType.toLowerCase().indexOf("win") != -1) ? ".dll"
: ".so";
String libFullName = libName+osArch+ libExtension;
String nativeTempDir = System.getProperty("java.io.tmpdir");
InputStream in = null;
BufferedInputStream reader = null;
FileOutputStream writer = null;
File extractedLibFile = new File(nativeTempDir + File.separator
+ libFullName);
if (!extractedLibFile.exists()) {
try {
in = new FileInputStream(dllPath+ File.separator+
libFullName);
reader = new BufferedInputStream(in);
writer = new FileOutputStream(extractedLibFile);
byte[] buffer = new byte[1024];
while (reader.read(buffer) > 0) {
writer.write(buffer);
buffer = new byte[1024];
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (in != null)
in.close();
if (writer != null)
writer.close();
}
}
System.load(extractedLibFile.toString());
}
为什么你需要额外的“资源”?
当使用System.loadLibrary("resources/TecJNI");
您在子文件夹中寻找TecJNI.dll "resources"
的的java.library.path的。 所以,如果你把C:\ Windows \ System32下的库路径(这你就不需要,因为它是默认的搜索路径),您的图书馆应该是C:\windows\system32\resources\TecJNI.dll