如何使用JNI,但仅限于当前平台可用?

时间:2010-03-12 10:23:09

标签: java java-native-interface

可选使用JNI的常用方法(或最佳做法)是什么?

E.g。我有一个Java类,这个类是100%纯Java,所以它可以在所有平台上运行。但是,在某些平台上,我想使用JNI加速一些繁重的计算 - 这很好。不幸的是,我无法支持世界上任何现有的Java平台。所以我想最初只支持三巨头:Linux,Windows,Mac OS X。

所以我想做的是在这三个平台上使用JNI,并在所有其他平台上使用100%纯Java版本。现在我可以想办法如何做到这一点(例如动态加载类,加载JNI类或纯Java类),但认为这是一个常见的问题,成千上万的项目必须在过去解决,我真的很惊讶,没有找到任何文件或参考问题如何最优雅或有效地解决这个问题。

2 个答案:

答案 0 :(得分:1)

您的平台相关代码应该是依赖于平台的类; - )

假设您有一个主“算法”类(或更好的接口)。 此接口由使用JNI的WindowsAlgorithm和未执行此操作的HaikuAlgorithm实现(仅用于示例)。你现在唯一需要做的就是根据你的客户端操作系统加载正确的操作系统,我认为这是相当普通的。

答案 1 :(得分:1)

如果真的有意义提供两个不同版本,您可以执行以下操作:

  • 为班级
  • 创建一个界面
  • 在纯Java中实现接口
  • 在使用JNI的类中实现接口

然后你可以编写一个实例化正确类的工厂方法:

public static SomeInterface getInterface()
{               
    SomeInterface res = new JavaSomeInterfaceImpl();

    if (System.getProperty("os.name").matches(".*Windows.*"))
    {
        File library = new File("mylibrary.dll");
        System.load(library.getAbsolutePath());
        res = new NativeSomeInterfaceImpl();
    }

    return res; 
}