我希望有人可以帮助我解决我的问题。我正在 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");
错误:
线程“主”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]: