我希望有人能幫我解決我的問題。我正在Linux上編譯一些最初爲Windows創建的JNI C包裝器(我有一個問題已經解決了[這裏] [1])。我目前的問題是以下。爲JNI鏈接C包裝後的java.lang.UnsatisfiedLinkError
的代碼基本上是由在aaa.c,aaa.h,bbb.c和bbb.h
aaa.h is the header generated by "javah" tool.
aaa.c is the implementation of aaa.h bbb.h and bbb.c have some
functions called by aaa.c, one of them is:
int jstring2char(JNIEnv*, jstring, char**);
現在,我創建了代碼:: 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個警告。
然後我安裝在選擇/ somepath /庫:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/somepath
現在,當我嘗試加載生成的庫
System.loadLibrary("libWrapper.so");
錯誤:
Exception in thread "main" java.lang.UnsatisfiedLinkError: no libWrapper.so in java.library.path
產生。我的第一個猜測是,有一些unsatisfaied依賴性,因此我RN LDD:
[email protected]:/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);
實際上,我在不同的消息有:
Exception in thread "main" java.lang.UnsatisfiedLinkError: Unable to load library 'libWrapper.so': libWrapper.so: undefined symbol: jstring2char
jstring2char是一個在bbb.h中聲明的函數,在bbb.c中實現,由aaa.c調用。現在看來aaa.c不能解析bbb.c函數,儘管兩者在構建時都是鏈接的。
現在我的問題是可能是什麼UnsatisfiedLinkError,Linux的gate.so.1或功能jstring2char的原因?社區可以給我什麼提示?
非常感謝。 [1]:
什麼是實際的本地函數(在Java和頭)? –