gpt4 book ai didi

java - JNI 以 "undefined symbol"退出

转载 作者:行者123 更新时间:2023-11-28 07:10:18 26 4
gpt4 key购买 nike

我正在尝试通过 Java 的 Crypto++ 包使用 AES。因此,我的 Java 代码中有两个 native 方法 encryptdecrypt,然后由 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 的 header 。我很好奇为什么在检查符号时显示 U

有没有人知道可能导致问题的原因或下一步应该去哪里解决问题?非常欢迎任何提示/见解!

最佳答案

首先编译您的 CI3CppEncryptionTools.c,然后将其 .o 链接到 .so。您正在链接 .c

编辑:通过以下方式将您的 cryptocpp 库静态链接到您的共享库:-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

关于java - JNI 以 "undefined symbol"退出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21093377/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com