如何通过Java代码影响System.loadLibrary()的搜索路径?
2022-09-01 21:23:49
在Java项目中,我正在使用第三方库,该库通过以下方式加载一些本机库
System.loadLibrary("libName");
我希望能够从我的应用程序中影响此方法的搜索路径,以便用户不需要在命令行上指定正确的java.library.path值(此值取决于当前的操作系统和体系结构)。例如,在Windows上,我想将其设置为“lib/native/windows”,在Linux 32bit上设置为“lib/native/linux32”等。
我试过了
System.setProperty("java.library.path", ...)
但这被忽略了,显然是因为JVM在我的代码运行之前只读取此属性一次。
我还尝试在使用依赖于它的Java库之前加载本机libray
System.load("fullPath/lib")
此调用成功,但当使用 System.loadLibrary() 再次加载本机库时,仍会出现一个不满意的 LinkError。
我发现的唯一方法是:
- 添加抽象化外部库的整个 API 的接口。
- 在代码的其余部分中仅使用这些接口。
- 添加实现接口并委托到库的类。
- 编写自己的类加载器,即
- 覆盖 findLibary(), 以便在正确的路径中找到本机库
- 覆盖 loadClass() 并加载外部库和包装层的所有类,而不是像默认的 ClassLoader 那样尝试委托给其父级
- 确保使用正常的 ClassLoader 加载接口,并使用我自己的 ClassLoader 加载包装类和外部库。
这有效,但我发现它非常复杂,而且需要付出很多努力,因为我需要添加所有这些接口。有没有更简单的方法?