代码之家  ›  专栏  ›  技术社区  ›  Mecki

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

  •  2
  • Mecki  · 技术社区  · 16 年前

    通常的方法(或最佳实践)是什么 任选地 使用JNI?

    例如,我有一个Java类,这个类是100%纯Java,所以它可以在所有平台上运行。但是,在某些平台上,我希望使用JNI加速一些繁重的计算——这很好。不幸的是,我无法支持世界上任何现有的Java平台。所以我想最初只支持三大系统是可以的:Linux、Windows、MacOSX。

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

    2 回复  |  直到 16 年前
        1
  •  1
  •   Daff    16 年前

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

    • 为类创建接口
    • 用纯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; 
    }
    
        2
  •  1
  •   Riduidel    16 年前

    您的平台依赖代码应位于平台依赖类中;-)

    假设您有一个主要的“算法”类(或者更好的,接口)。 这个接口是由一个使用JNI的windowsalgorithm和一个不这样做的haikualgorithm实现的(只是为了举例)。你现在唯一要做的就是根据你的客户操作系统加载正确的操作系统,我认为这是很平常的事情。

    推荐文章