链接JNI的C包装器后出现java.lang.UnsatifiedLinkError

链接JNI的C包装器后出现java.lang.UnsatifiedLinkError,java,c,linux,java-native-interface,unsatisfiedlinkerror,Java,C,Linux,Java Native Interface,Unsatisfiedlinkerror,我希望有人能帮我解决我的问题。我正在Linux上编译一些最初为Windows创建的JNI C包装器(我有一个问题[这里][1]已经解决了)。我目前的问题如下 代码基本上由aaa.c、aaa.h、bbb.c和bbb.h组成 h是由“javah”工具生成的头文件 c是aaa.h的实现bbb.h和bbb.c有一些 aaa.c调用的函数,其中一个是: 现在,我在Code::Blocks中创建了一个项目。构建项目时,将执行以下命令: gcc -Wall -g -D_GNU_SOURCE -DUNIX

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

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

h是由“javah”工具生成的头文件

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

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

现在,我在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

是生成的。我的第一个猜测是,存在一些不满意的依赖关系,因此我认为:

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)
所以我的第一个问题是,我不知道是不是“LinuxGate.So.1”导致了这个问题

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

Native.loadLibrary("libWrapper.so", SClass.class);
实际上,我得到了不同的信息:

线程“main”java.lang.UnsatifiedLinkError中出现异常:无法 加载库“libWrapper.so”:libWrapper.so:未定义的符号: jstring2char

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

现在我的问题是,linux gate.so.1或函数jstring2char?会导致不满意的链接错误的原因是什么?。社区能给我什么提示

多谢各位。 [1] :

你需要说:

System.loadLibrary("Wrapper");

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

谢谢您的提示,Kerrek。现在,我在System.loadLibrary和Native.loadLibrary(“未定义的符号:jstring2char”)中遇到了相同的错误。它解决了我的部分问题。另一部分是aaa.c不能调用bbb.c函数的原因,如果两者都链接在一起:(@Ferite:you compile with
-fPIC
?我在项目中添加了-fPIC选项。IDE在文件的编译命令中添加了该选项,而不是在共享库的构建中添加了该选项。但是,加载库时结果是一样的。最后,除了这里提到的一个明显错误之外,唯一的问题是加载库时名称“错误”,因此@Kerrek SB response是解决方案。实际的本机函数是什么(在Java和标头中)?
System.loadLibrary("Wrapper");