链接C包装为JNI后的java.lang.UnsatisfiedLinkError

时间:2013-09-25 23:08:17

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

我希望有人可以帮我解决我的问题。我正在为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

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

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);

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

  

线程“main”中的异常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]:

1 个答案:

答案 0 :(得分:1)

你需要说:

System.loadLibrary("Wrapper");

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