使用相对路径名从不同目录加载JNI库的可移植语句?

 2023-01-19    372  

问题描述

是否有与平台无关的Java语句来加载与Java源代码在不同目录中的本机库?我想使用这样的东西:

public class HelloWorld {
    static {
        System.loadLibrary("../some_project/HelloWorld");
    }

    public static native void print();
}

问题是System.loadLibrary()不支持路径名参数中的目录分离器.另外,不幸的是,system.load()需要一个绝对的路径名,这不仅意味着我不能指定上述相对目录(我想做的),而且还需要参数来包括例如前面的Linux系统上JNI库名称上的” Lib”和” .so”扩展.

使用相对路径名从不同目录加载JNI库的可移植语句?

是否有一种标准的处理方式?如果可能的话,我想避免编写一堆依赖平台的Java代码,只是为了构建正确的JNI库名称.

推荐答案

我相信您正在寻找 system.maplibraryname ,这是 classLoader.findlibrary 实现.例如:

File lib = new File("../some_project/" + System.mapLibraryName("HelloWorld"));
System.load(lib.getAbsolutePath());

这将在Linux上使用libHelloWorld.so,在Windows上使用HelloWorld.dll.请注意,某些操作系统支持多个扩展,而MapLibraryName只能通过设计支持一个.我知道的是macOS(.dylib主要是旧的,.jnilib用于旧)和aix(.a and .so).

其他推荐答案

好吧,正如您清楚地解释的那样,您不能使用loadLibrary.因此,它留下了load.但这需要一个绝对的路径.因此,使用首选的文件路径实用程序功能将相对路径扩展到绝对路径中,然后将其传递到load.这似乎不方便,但比依靠图书馆搜索路径的变化更强.

以上所述是小编给大家介绍的使用相对路径名从不同目录加载JNI库的可移植语句?,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!

原文链接:https://77isp.com/post/25830.html

=========================================

https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。