首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当本机库在JAR中存档时,JavaCPP,UnsatisfiedLinkError

当本机库在JAR中存档时,JavaCPP,UnsatisfiedLinkError
EN

Stack Overflow用户
提问于 2016-01-24 17:05:25
回答 1查看 1.5K关注 0票数 2

我试图从Java调用Haskell代码,使用JavaCPP帮助创建必要的JNI绑定,就像这个问题中已经讨论过的那样。

我就是这样用它的:

代码语言:javascript
复制
<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含量

代码语言:javascript
复制
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);
    }
}

汇编:

代码语言:javascript
复制
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创建一个javacpp和一个libjniHScode.so,它可以在以下方面运行:

代码语言:javascript
复制
$ java -cp javacpp.jar:. com.example.HScode

瓦罐

现在,下面的步骤是,我希望将所有东西打包到一个jar中,并且能够从一个更大的java项目中使用这个jar的com.example.HScode

JavaCPP的页面提到:

..。此外,在运行时,Loader.load()方法会自动从Java加载本机库,这些库通过构建过程放置在正确的目录中。--它们甚至可以存档在JAR文件中,它不会改变任何。用户根本不需要弄清楚如何让系统加载文件。

所以我觉得这个应该能行。

但是,如果我用上面的HScode.jar文件夹的内容制作一个jar build,那么我的jar包含libjniHScode.solibHScode.so,并且运行它时:

代码语言:javascript
复制
$ java -cp javacpp.jar:HScode.jar:. com.example.HScode

然后它就找不到我的本机代码(为匿名而编辑的异常):

代码语言:javascript
复制
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中存档时是否能够找到本机代码?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-25 11:14:50

通过调用javacpp -jar javacpp.jar com.example.HScodecom/example/linux-x86_64/中自动输出它们为本机库构建,Loader从那里加载它们。因此,当以其他方式构建本机库时,如果我们想让com/example/linux-x86_64/找到它们,无论是在JAR文件中还是作为普通文件,它们仍然需要移动到Loader

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34978732

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档