JNI退出"undefined symbol"
JNI exits with "undefined symbol"
我正试图通过Java中的Crypto++包使用AES。因此,我在Java代码中有两个本机方法encrypt
和decrypt
,然后用C封装它们,以便访问C++方法。从命令行运行我的C++程序是可行的,但通过JNI从Java调用它失败,并出现undefined symbol
错误:
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
。
有人知道是什么导致了问题,或者下一步该去哪里解决问题吗?非常欢迎任何提示/见解!
首先编译您的CI3CppEncryptionTools.c,然后将其.o链接到.so。您正在链接.c
编辑:通过:-Wl,--whole-archive libcryptocpp.a -Wl,--no-whole-archive
将您的加密应用程序库静态链接到共享库
gcc -I${JAVA_HOME}/include -O3 -fwhole-program -fdata-sections -ffunction-sections -Wall -shared -fPIC -o libCI3CppEncryptionTools.so CI3CppEncryptionTools.c CI3CppEncryptionToolsImpl.o -Wl,--whole-archive libcryptocpp.a -Wl,--no-whole-archive -Wl,--gc-sections
我总是忘记在第二步链接Crypto++库(实际上我在第一步就链接了,这完全是无稽之谈)。这两个命令编译库是好的!
g++ -c -Icryptopp562 -O3 -fPIC -fpermissive CI3CppEncryptionToolsImpl.cpp
gcc -I${JAVA_HOME}/include -O3 -shared -fPIC -o libCI3CppEncryptionTools.so CI3CppEncryptionTools.c CI3CppEncryptionToolsImpl.o -lcryptopp
相关文章:
- 从 C 可执行文件加载动态库时收到错误C++"undefined symbol"
- 为什么当我在 C 程序中链接静态库时会"undefined symbol"?
- OpenCV imwrite 函数导致'undefined symbol'
- 在 Python 3.6 中调用C++扩展时导入错误"undefined symbol: _ZNK9FastNoise8GetNoiseEff"
- PostgreSQL & CMakeLists - Undefined symbol [...] _my_sock_read in libpq.a(fe-secure-openssl.o)
- C++ Python 模块导入错误: "undefined symbol: Py_InitModule3" ( Py_InitModule () )
- clang.cindex.LibclangError "Undefined symbol clang_CXXRecord_isAbstract"
- 函数"Undefined symbol"错误
- OpenSSL 1.0.1f 和 "undefined reference to symbol 'SSL_state@@OPENSSL_1.0.0"
- 链接器为某些上下文中使用的集成静态常量成员提供错误"undefined symbol"
- JNI退出"undefined symbol"
- 导入 SWIG+python 模块时出现"undefined symbol"错误
- 混合 C/C++ 代码可产生"undefined symbol"共享库
- Swig C to Python ImportError: undefined symbol
- 运行时 c++ "undefined symbol"异常
- 有错误"Undefined symbols for architecture x86_64"和"ld: symbol(s) not found for architecture x86_64"
- 如何解决"relocation truncated to fit: R_X86_64_PC32 against undefined symbol `xercesc_3_1::AbstractDOMPa
- 线程"main" java.lang.UnsatisfiedLinkError: undefined symbol: test
- libboost_python3.so.1.56.0: undefined symbol: PyClass_Type
- 为什么编译器在不使用库时会给我错误"undefined external symbol"?