小编sup*_*eta的帖子

Java - 通过相对路径加载dll并将它们隐藏在jar中

第1部分

我正在开发一个应该作为jar发布的Java应用程序.该程序依赖于JNI调用的C++外部库.要加载它们,我使用System.load绝对路径的方法,这很好.

但是,我真的想在JAR中"隐藏"它们,所以我创建了一个包来收集它们.这迫使我加载一个相对路径 - 包路径.通过这种方法,我让用户在任何目录中运行JAR,而不用担心链接DLL或无聊以前的安装过程.

这会引发预期的异常:

线程"main"中的异常java.lang.UnsatisfiedLinkError:期望库的绝对路径

我怎样才能使这个工作?

第2部分

将DLL复制到文件夹(下面解释)的方法仅在我在eclipse环境下运行时才有效.运行导出的JAR,DLL二进制文件很好地创建,但加载JNI会抛出下一个异常:

线程"main"java.lang.reflect.InvocationTargetException中的异常

 at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:56)
 Caused by: java.lang.UnsatisfiedLinkError: C:\Users\Supertreta\Desktop\nm files\temp\jniBin.dll: Can't find dependent libraries at java.lang.ClassLoader$NativeLibrary.load(Native Method)
Run Code Online (Sandbox Code Playgroud)

我运行这个加载方法:

public static void loadBinaries(){
        String os = System.getProperty("os.name").toLowerCase();

        if(os.indexOf("win") >= 0){
            ArrayList<String> bins = new ArrayList<String>(){{
                add("/nm/metadata/bin/dependence1.dll");
                add("/nm/metadata/bin/dependence2.dll");
                add("/nm/metadata/bin/dependence3.dll");
                add("/nm/metadata/bin/dependence4.dll");
                add("/nm/metadata/bin/jniBin.dll");
            }};

            File f = null;
            for(String bin : bins){
                InputStream in = FileManager.class.getResourceAsStream(bin);
                byte[] buffer = new byte[1024];
                int read = -1;
                try {
                    String[] temp = bin.split("/");
                    f = new …
Run Code Online (Sandbox Code Playgroud)

java java-native-interface jar loading relative-path

20
推荐指数
1
解决办法
4万
查看次数

Java - 捕获System.load()错误

我的主要():

System.out.println("Start loading libraries");
boolean b2 = false;
try{
  b2 = FileManager.loadBinaries();
} catch (Exception e){
  System.out.println("Exception on loading");
}
System.out.println("Libraries loading ended");
Run Code Online (Sandbox Code Playgroud)

LoadBinaries():

public static boolean loadBinaries(){
    String os = System.getProperty("os.name").toLowerCase();
    ArrayList<String> bins = new ArrayList<String>();

    if(os.indexOf("windows 7") >= 0 || os.indexOf("windows vista") >= 0){
        bins.add("/nm/metadata/bin/win/libcurld.dll");
        bins.add("/nm/metadata/bin/win/libfftw3f-3.dll");
        bins.add("/nm/metadata/bin/win/libmad.dll");
        bins.add("/nm/metadata/bin/win/libsamplerate.dll");
        bins.add("/nm/metadata/bin/win/seven/mylib.dll");
    }
    else if(os.indexOf("windows xp") >= 0){
        bins.add("/nm/metadata/bin/win/libcurld.dll");
        bins.add("/nm/metadata/bin/win/libfftw3f-3.dll");
        bins.add("/nm/metadata/bin/win/libmad.dll");
        bins.add("/nm/metadata/bin/win/libsamplerate.dll");
        bins.add("/nm/metadata/bin/win/xp/mylib.dll");
    } else if(os.indexOf("mac") >= 0){
        return false;
    }

    File f = null;
    for(String bin : bins){
        InputStream in …
Run Code Online (Sandbox Code Playgroud)

java java-native-interface load

8
推荐指数
2
解决办法
6834
查看次数

标签 统计

java ×2

java-native-interface ×2

jar ×1

load ×1

loading ×1

relative-path ×1