我試圖通過Java的Crypto ++包使用AES。因此,我在我的Java代碼中有兩個本地方法encrypt
和decrypt
,然後它們被C包裝以訪問C++方法。 在命令行工作運行我的C++程序,但通過JNI從Java調用失敗與undefined symbol
錯誤:JNI用「未定義符號」退出
Exception in thread "main" java.lang.UnsatisfiedLinkError: /home/yves/temp/lib/libCI3CppEncryptionTools.so: /home/yves/temp/lib/libCI3CppEncryptionTools.so: undefined symbol: _ZTIN8CryptoPP6FilterE
我通過它編譯:
g++ -c -Icryptopp562 -O3 -fwhole-program -fdata-sections -ffunction-sections -fPIC -fpermissive CI3CppEncryptionToolsImpl.cpp -Lcryptopp562 -lcryptopp
gcc -I${JAVA_HOME}/include -O3 -fwhole-program -fdata-sections -ffunction-sections -Wall -shared -fPIC -o libCI3CppEncryptionTools.so CI3CppEncryptionTools.c CI3CppEncryptionToolsImpl.o -Wl,--gc-sections
所以第一C++部分然後與C包裝器結合使用。 -fdata-sections
,-ffunction-sections
和-Wl,--gc-sections
是我試圖剝離死代碼,因爲我想也許JNI不喜歡未使用或未引用的代碼。
我檢查,如果該符號是通過使用未定義:
nm lib/libCI3CppEncryptionTools.so | grep _ZTIN8CryptoPP6FilterE
U _ZTIN8CryptoPP6FilterE
是的,它是。但爲什麼我的C++命令行程序工作?檢查這將產生相同的結果。
我也看了符號了:
c++filt _ZTIN8CryptoPP6FilterE
typeinfo for CryptoPP::Filter
爲CryptoPP::Filter
頭是包括在內。我很好奇爲什麼它在檢查符號時顯示U
。
有沒有人有任何想法是什麼可能導致問題或在哪裏尋找旁邊解決問題?任何提示/見解都非常受歡迎!
JNI入口點通常不會被您的庫引用,因此如果告訴GCC刪除未使用的符號,它是不是會刪除它們? –
這可能是這種情況,但即使我刪除傳遞給GCC的這些參數,它仍然不起作用。 – yvesonline