JavaCPP,在JAR中归档本机库时出现UnsatisfiedLinkError

Cornuz

我正在尝试使用JavaCPP从Java调用Haskell代码,以帮助创建必要的JNI绑定,如本问题所述

这就是我的使用方式:

<rootdir>
  /javacpp.jar
  /build (destination of libraris)
  /src   (contains Haskell code)
  /com/example/HSCode.java (Java class to load and use native lib)

内容HScode.java

package com.example;

import org.bytedeco.javacpp.*;
import org.bytedeco.javacpp.annotation.*;
import java.util.Scanner;
import java.io.File;
import java.io.FileNotFoundException;

@Platform(include={"<HsFFI.h>","HScode_stub.h"})
public class HScode {
    static { Loader.load(); }
    public static native void hs_init(int[] argc, @Cast("char***") @ByPtrPtr PointerPointer argv);
    public static native String code_hs(String text);

    public static void main(String[] args) throws FileNotFoundException {
        String s = new Scanner(new File("test.txt")).useDelimiter("\\Z").next();
        hs_init(null, null);
        String s1 = code_hs(s);
        System.out.println(s1);
    }
}

汇编:

cd <rootdir>
ghc --make -isrc -dynamic -shared -fPIC src/HScode.hs \
     -o build/libHScode.so -lHSrts-ghc7.8.4 -optl-Wl,-rpath,.
javac -cp javacpp.jar com/example/HScode.java
java -jar javacpp.jar -d build \
     -Dplatform.compiler=ghc -Dplatform.includepath="src:com/example" \
     -Dplatform.compiler.output="-optl-Wl,-rpath,. -optc-O3 -Wall build/libHScode.so -dynamic -fPIC -shared -lstdc++ -lHSrts-ghc7.8.4 -o " com.example.HScode

按照这种方法,我可以创建一个libHScode.so和一个libjniHScode.sousing javacpp,它可以很好地运行:

$ java -cp javacpp.jar:. com.example.HScode

现在,接下来的步骤是,我要将所有内容打包到一个jar中,并能够在com.example.HScode较大的Java项目中使用此jar

JavaCPP的页面提到:

[...]此外,在运行时,Loader.load()方法自动从Java资源加载本机库,这些资源在构建过程中位于正确的目录中。它们甚至可以存档在JAR文件中,它什么也不会改变用户根本不需要弄清楚如何使系统加载文件。

所以我认为这应该可行。

但是,如果我HScode.jar根据上述build文件夹的内容制作了一个jar ,以便我的jar同时包含libjniHScode.solibHScode.so,并使用以下命令运行它:

$ java -cp javacpp.jar:HScode.jar:. com.example.HScode

那么它找不到我的本机代码(为匿名化而编辑的例外):

Exception in thread "main" java.lang.UnsatisfiedLinkError: no jniHScode in java.library.path
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1865)
    at java.lang.Runtime.loadLibrary0(Runtime.java:870)
    at java.lang.System.loadLibrary(System.java:1122)
    at org.bytedeco.javacpp.Loader.loadLibrary(Loader.java:597)
    at org.bytedeco.javacpp.Loader.load(Loader.java:438)
    at org.bytedeco.javacpp.Loader.load(Loader.java:381)
    at com.example.HScode.<clinit>(HScode.java:13)
Caused by: java.lang.UnsatisfiedLinkError: /compilation-path/linux-x86_64/libjniHScode.so: HScode.so: cannot open shared object file: No such file or directory
    at java.lang.ClassLoader$NativeLibrary.load(Native Method)
    at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1937)
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1822)
    at java.lang.Runtime.load0(Runtime.java:809)
    at java.lang.System.load(System.java:1086)
    at org.bytedeco.javacpp.Loader.loadLibrary(Loader.java:580)

我想念什么?有谁知道JavaCPP在jar中存档时是否真的可以找到本机代码?

塞缪尔·奥德(Samuel Audet)

通过调用本地库进行构建,方法是自动将其javacpp -jar javacpp.jar com.example.HScode输出com/example/linux-x86_64/Loader从那里加载。因此,当通过其他方式构建本机库时com/example/linux-x86_64/,如果我们希望Loader找到它们,则无论是将其存储在JAR文件中还是将其存储为普通文件,都仍然需要将它们移动到

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

找到本机库时出现 Java UnsatisfiedLinkError

来自分类Dev

本机库加载时出现无法解释的UnsatisfiedLinkError

来自分类Dev

本机库加载时出现无法解释的UnsatisfiedLinkError

来自分类Dev

在Android 5.0中加载本机库时出现java.lang.UnsatisfiedLinkError

来自分类Dev

sbt下的本机库出现UnsatisfiedLinkError

来自分类Dev

运行Clojure JAR时Java无法找到本机库

来自分类Dev

运行Clojure JAR时Java无法找到本机库

来自分类Dev

如何在导出到 jar 时包含 opencv 本机库

来自分类Dev

UnsatisfiedLinkError:未找到本机库“wcepeer”(Mysaifu)

来自分类Dev

Android L预览不搜索“ armeabi”文件夹中的本机库(UnsatisfiedLinkError)

来自分类Dev

在OSGi中加载本机linux库时出现UnsatisfiedLinkError

来自分类Dev

Android Studio:UnsatisfiedLinkError:findLibrary返回null-加载本机库

来自分类Dev

Android L(5.0)不在eclipse中的“ armeabi”或“ armeabi-v7a”文件夹(UnsatisfiedLinkError)中搜索本机库

来自分类Dev

在React Native 0.61+中添加本机库时,我应该生成本机版本吗?

来自分类Dev

加载包含相同符号的两个本机库时出现内存问题

来自分类Dev

UnsatisfiedLinkError:本机库C:\ Domino \ nlsxbe.dll已加载到另一个类加载器中

来自分类Dev

本机方法中的UnsatisfiedLinkError

来自分类Dev

本机方法中的UnsatisfiedLinkError

来自分类Dev

在Scala中加载本机库时出错

来自分类Dev

与Rust中的本机库链接时,将符号暴露给动态链接器

来自分类Dev

如何在rubymotion中包含本机库

来自分类Dev

react-native中的本机库

来自分类Dev

代码名中的AndroidX本机库支持

来自分类Dev

测试本机库中的可用入口点

来自分类Dev

java.lang.UnsatisfiedLinkError:本机库XXX.so已加载到另一个类加载器中

来自分类Dev

UnsatisfiedLinkError:运行播放应用程序时如何加载opencv本机库?

来自分类Dev

从Java和Python调用本机库时如何释放内存?

来自分类Dev

从Android Studio 6.1构建本机库时出错

来自分类Dev

从Android Studio 6.1构建本机库时出错

Related 相关文章

  1. 1

    找到本机库时出现 Java UnsatisfiedLinkError

  2. 2

    本机库加载时出现无法解释的UnsatisfiedLinkError

  3. 3

    本机库加载时出现无法解释的UnsatisfiedLinkError

  4. 4

    在Android 5.0中加载本机库时出现java.lang.UnsatisfiedLinkError

  5. 5

    sbt下的本机库出现UnsatisfiedLinkError

  6. 6

    运行Clojure JAR时Java无法找到本机库

  7. 7

    运行Clojure JAR时Java无法找到本机库

  8. 8

    如何在导出到 jar 时包含 opencv 本机库

  9. 9

    UnsatisfiedLinkError:未找到本机库“wcepeer”(Mysaifu)

  10. 10

    Android L预览不搜索“ armeabi”文件夹中的本机库(UnsatisfiedLinkError)

  11. 11

    在OSGi中加载本机linux库时出现UnsatisfiedLinkError

  12. 12

    Android Studio:UnsatisfiedLinkError:findLibrary返回null-加载本机库

  13. 13

    Android L(5.0)不在eclipse中的“ armeabi”或“ armeabi-v7a”文件夹(UnsatisfiedLinkError)中搜索本机库

  14. 14

    在React Native 0.61+中添加本机库时,我应该生成本机版本吗?

  15. 15

    加载包含相同符号的两个本机库时出现内存问题

  16. 16

    UnsatisfiedLinkError:本机库C:\ Domino \ nlsxbe.dll已加载到另一个类加载器中

  17. 17

    本机方法中的UnsatisfiedLinkError

  18. 18

    本机方法中的UnsatisfiedLinkError

  19. 19

    在Scala中加载本机库时出错

  20. 20

    与Rust中的本机库链接时,将符号暴露给动态链接器

  21. 21

    如何在rubymotion中包含本机库

  22. 22

    react-native中的本机库

  23. 23

    代码名中的AndroidX本机库支持

  24. 24

    测试本机库中的可用入口点

  25. 25

    java.lang.UnsatisfiedLinkError:本机库XXX.so已加载到另一个类加载器中

  26. 26

    UnsatisfiedLinkError:运行播放应用程序时如何加载opencv本机库?

  27. 27

    从Java和Python调用本机库时如何释放内存?

  28. 28

    从Android Studio 6.1构建本机库时出错

  29. 29

    从Android Studio 6.1构建本机库时出错

热门标签

归档