gpt4 book ai didi

java - 带有静态库的 JNI : unsatisfied link error

转载 作者:行者123 更新时间:2023-12-02 03:38:49 30 4
gpt4 key购买 nike

我用 g++ 构建了一个静态库:


g++-5 main.cpp -fPIC -Wall -std=c++11 -lboost_system ……

现在我想通过 JNI 调用它的方法:

public static void main(String[] args) {
System.load("/Users/XXX/example/libjnidb4java.a");
JNIDB db = new JNIDB();
db.createTable("Name", "Dir");
}

结果出现了 UnsatisfiedLinkError 异常:

Exception in thread "main" java.lang.UnsatisfiedLinkError: /Users/XXX/example/libjnidb4java.a: dlopen(/Users/XXX/example/libjnidb4java.a, 1): no suitable image found.  Did find:
/Users/XXX/example/libjnidb4java.a: unknown file type, first eight bytes: 0x21 0x3C 0x61 0x72 0x63 0x68 0x3E 0x0A
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)

注意

我尝试使用动态库,它工作正常,但就我而言,我需要它是静态库。我通过 ar -r libjnidb4java.a a.out 创建这个静态库。

而且我发现Java 8已经支持静态链接库here 。就像文档所说,我创建了一个方法:


jint JNI_OnLoad_xxxdb4java(JavaVM *vm, void *保留) {
返回JNI_VERSION_1_8;
}

最佳答案

您无法动态加载静态库。您只能动态加载共享库。

您引用的 JNI 文档讨论了将 JNI 与静态库一起使用,但这假设您已将库静态链接到 JVM 中。因此,如果您确实必须使用静态库,那么您将不得不重建自己的 JVM,这听起来像是一种不值得羡慕的经历。

我不清楚为什么使用静态库和共享库对你来说有区别(毕竟,你仍然在尝试动态加载它,这对我来说是动态库),但我会尽力克服这个问题首先是限制。

如果您想为您的用户创建单个可安装单元,那么您想要的就是创建您自己的单个共享库。然后,您的库应该静态链接其依赖项,以便它们包含在您的库中。然后,您可以在该单个单元上使用 loadLibrary,而不必担心安装依赖项。

关于java - 带有静态库的 JNI : unsatisfied link error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37095168/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com