【问题标题】:java.lang.UnsatisfiedLinkError after linking C wrappers for JNI为 JNI 链接 C 包装器后的 java.lang.UnsatisfiedLinkError
【发布时间】:2013-09-25 23:08:16
【问题描述】:

我希望有人可以帮助我解决我的问题。我正在 Linux 上编译一些最初为 Windows 创建的 JNI 的 C 包装器(我有一个已经解决的问题 [这里][1])。我目前的问题如下。

代码基本由aaa.c、aaa.h、bbb.c和bbb.h组成

aaa.h 是“javah”工具生成的头文件。

aaa.c 是 aaa.h 的实现 bbb.h 和 bbb.c 有一些

aaa.c调用的函数,其中之一是:

int jstring2char(JNIEnv*, jstring, char**);

现在,我在 Code::Blocks 中创建了一个项目。构建项目时,这些是执行的命令:

gcc -Wall  -g -D_GNU_SOURCE -DUNIX    -I../somepath/Inc -I/usr/local/jdk1.7.0_40/include/linux -I/usr/local/jdk1.7.0_40/include  -c /somepath/Scr/aaa.c -o obj/Debug/aaa.o
gcc -Wall  -g -D_GNU_SOURCE -DUNIX    -I../somepath/Inc -I/usr/local/jdk1.7.0_40/include/linux -I/usr/local/jdk1.7.0_40/include  -c /somepath/Scr/bbb.c -o obj/Debug/bbb.o
g++ -shared  obj/Debug/aaa.o obj/Debug/bbb.o   -o bin/Debug/libWrapper.so  

该过程完成,出现 0 个错误,0 个警告。

然后我在 /opt/somepath 中安装了库:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/somepath

现在当我尝试加载生成的库时

System.loadLibrary("libWrapper.so");

错误:

线程“main”java.lang.UnsatisfiedLinkError 中的异常:java.library.path 中没有 libWrapper.so

生成。我的第一个猜测是有一些不满意的依赖,所以我 rn ldd:

root@Ubuntu10:/opt/somepath# ldd libWrapper.so
    linux-gate.so.1 =>  (0x00110000)
    libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00161000)
    libm.so.6 => /lib/tls/i686/cmov/libm.so.6 (0x00111000)
    libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00662000)
    libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0x00bae000)
    /lib/ld-linux.so.2 (0x00915000)

所以我的第一个问题是我不知道“linux-gate.so.1”是否是导致问题的原因。

另一方面,我通过使用 jna API 加载库进行测试,只是为了检查是否有更具体的错误消息:

Native.loadLibrary("libWrapper.so", SClass.class);

实际上,我收到了不同的信息:

线程“主”java.lang.UnsatisfiedLinkError 中的异常:无法 加载库'libWrapper.so':libWrapper.so:未定义符号: jstring2char

jstring2char 是在 bbb.h 中声明的函数,在 bbb.c 中实现,由 aaa.c 调用。现在看来 aaa.c 并没有解析 bbb.c 函数,尽管它们在构建时是链接的。

现在我的问题是 UnsatisfiedLinkError、linux-gate.so.1 或函数 jstring2char 的原因可能是什么?社区能给我什么提示?

非常感谢。 [1]:

【问题讨论】:

  • 实际的本机函数是什么(在 Java 和标头中)?

标签: java c linux java-native-interface unsatisfiedlinkerror


【解决方案1】:

你需要说:

System.loadLibrary("Wrapper");

文件名会根据您的系统自动计算(例如,在 Windows 上为 Wrapper.dll)。

【讨论】:

  • 感谢您的提示,Kerrek。现在我得到了与 System.loadLibrary 和 Native.loadLibrary 相同的错误(“未定义符号:jstring2char”)。它解决了我的部分问题。另一部分是为什么 aaa.c 如果两者都链接在一起就不能调用 bbb.c 函数:(
  • @Ferite:你用-fPIC编译了吗?
  • 我在项目中添加了 -fPIC 选项。 IDE 将选项添加到文件的编译命令,而不是共享库的构建。但是加载库时结果是一样的。
  • 最后,除了一个明显的错误在这里不提,唯一的问题是加载库时的“错误”名称,所以@Kerrek SB 响应是解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-04
  • 1970-01-01
  • 2014-10-26
  • 1970-01-01
  • 1970-01-01
  • 2013-08-14
相关资源
最近更新 更多