2013-09-25 96 views
0

我希望有人能幫我解決我的問題。我正在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]:

+0

什麼是實際的本地函數(在Java和頭)? –

回答

1

你需要說:

System.loadLibrary("Wrapper"); 

的文件名會自動計算取決於你的系統(例如,它會是在Windows Wrapper.dll)。

+0

感謝您的提示,Kerrek。現在我得到了與System.loadLibrary和Native.loadLibrary(「未定義的符號:jstring2char」)相同的錯誤。它解決了我的部分問題。另一部分是爲什麼aaa.c不能調用bbb.c函數,如果兩者都鏈接在一起的話: – Ferite

+0

@Ferite:你用'-fPIC'編譯了嗎? –

+0

我在項目中添加了-fPIC選項。 IDE將選項添加到文件的編譯命令中,而不是共享庫的構建。當庫加載時,結果是相同的。 – Ferite