1

我正在尝试找到一种为当前操作系统动态加载平台相关库 jar 的方法。我需要访问使用 JNI 调用的第三方库,并为 Mac 和 Windows 提供不同的 jar。这两个库的所有调用和返回都是相同的,只需在编译后换出 lib 目录中的 jar 文件即可,但我希望我的应用程序能够确定应该在运行时加载哪个 jar。

我在这里找到了类似的帖子,但没有直接解决这个问题。 这篇文章展示了如何通过 ClassLoader 动态加载 jar,但据我所知,这意味着我必须使用Method method = clazz.getDeclaredMethod("methodName"),method.invoke()方法来调用该类提供的任何方法,并显式调用要加载到该类的每个类loader(我非常想避免)。

我希望找到一个看起来像这样的解决方案:

import external.lib.namespace.LibClassA;
import external.lib.namespace.LibClassB;

public class MyClass {
    static {
        if (System.getProperty("os.name").contains("Windows") {
            ClassLoader.getSystemClassLoader().load("Lib_win.jar");
        } else {
            ClassLoader.getSystemClassLoader().load("Lib_mac.jar");
        }
    }

    public static void Main(String[] args) {
        LibClassA.platformDependantCall();
        LibClassB.someOtherCall();
    }
}
4

2 回答 2

0
System.getProperty("os.name") 

不能用于每次都获取有关操作系统的信息。如果调用 JVM 的用户没有所需的安全权限,它将失败并出现 SecurityException 异常。

于 2013-08-08T11:28:59.313 回答
0

您所指的帖子有关于 JCL ClassLoader 框架的答案 - 请参阅https://stackoverflow.com/a/1450837/982341

如果您查看该框架的文档,您会发现它支持创建已加载类的实例,并提供将它们转换为适当对象的方法,因此您不必使用反射。

于 2012-03-08T01:28:41.310 回答