可以在Windows上为loadLibrary()修改java进程中的“路径”吗?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了可以在Windows上为loadLibrary()修改java进程中的“路径”吗?相关的知识,希望对你有一定的参考价值。
也许另一个“它无法完成”的问题:)
我有一个Java应用程序,可以构建32位或64位。我想在同一台机器上构建和测试两个版本。
我有一个本地库需要加载(真正的DLL集),这些库是在两个目录中构建和输出的。
.../小64/.DLL .../小32/.DLL
“...”部分在java“java.library.path”中设置
在app启动时,代码执行:
try {
System.loadLibrary("x32/native-library");
libraryLoaded_ = true;
} catch(Throwable e) {
try {
System.loadLibrary("x64/native-library");
libraryLoaded_ = true;
} catch(Throwable t) {
log.debug("failed to load module " + e); // : "" + path + "".",e);
log.debug(" or win8 module " + t); // : "" + path + "".",e);
}
}
这有效(部分)因为当程序编译为java 64位时加载32位库将失败,然后它将尝试64位版本。
但是native-library.dll依赖于与其自身位于同一文件夹中的其他DLLS,但除非java进程的系统路径环境变量中的该目录,否则它们将无法解析。
但是,如果x32和x64目录都在系统路径中,并且两者中的dll具有相同的名称,则依赖于DLL的加载方式存在歧义。
我想让native-library.dll首先从它所驻留的文件夹中加载它的依赖项。
我怎么能做到这一点? java.library.path似乎对正在加载的库的依赖dll的加载没有影响。
我想我需要以某种方式修改java应用程序进程中的路径,以便在调用“loadLibrary”之前包含本机库的位置。
是否可以在应用程序代码中执行此操作?在搜索进程的路径元素之前,是否有任何方法可以使loadLibrary加载dll首先从它的文件夹加载它的依赖项?
- 一般情况下,你不能在JVM启动后改变“java.library.path”(有一些dirty tricks使用反射来做,但最好不要)。
- 您可以使用
String archDataModel = System.getProperty("sun.arch.data.model");
来确定您的JVM是32位还是64位。 - 您可以使用自定义
ClassLoader
和修改后的findLibrary
方法从正确的位置加载库。但是,这只是为加载的库本身指定路径,而不是为它的依赖项指定路径。您只能通过更改PATH环境变量或更改当前目录来更改依赖关系。
以上是关于可以在Windows上为loadLibrary()修改java进程中的“路径”吗?的主要内容,如果未能解决你的问题,请参考以下文章
我可以在 Windows 上为 iOS 开发 Kivy 应用程序吗?