我正在尝试构建一个调用 C++ 后端的 android 应用程序。此后端使用 ZeroMQ 进行消息传递。根据 ZeroMQ 指南上的android 构建页面,我构建了一个 ndk 版本 6 的本机工具链,并使用它来(成功)构建 ZeroMQ。
但是,当我使用 JNI 实现构建自己的 .so 时,我似乎无法正确加载所有内容。具体来说,如果我调用System.LoadLibrary("zmq"),这将成功完成,但如果我随后调用 *System.LoadLibrary("my_lib")* 我总是收到 UnsatisfiedLinkError 抱怨:
Cannot load library reloc_library[1244]: 29 cannot locate zmq_msg_init'...
libmy_lib.so 已经生成了几种不同的方法,每种方法都没有成功。生成它后,我总是将 libmy_lib.so(以及 libzmq.so)复制到我的 android 项目的文件夹:libs/armeabi/。
# Compile all object files - this part was done for all options
/opt/android-toolchain/bin/arm-linux-androideabi-g++ -fpic -c Client_Events.cpp \
Client Wrapper.cpp jni.cpp -I /opt/android-root/include/ -I /my/project/specific/stuff
# Option 1 - Don't link the lib in at all
/opt/android-toolchain/bin/arm-linux-androideabi-g++ -shared \
-Wl,-soname,libmy_lib.so -o libmy_lib.so jni.o Client_Events.o Client_Wrapper.o
# Option 2 - Link ZeroMQ in statically
/opt/android-toolchain/bin/arm-linux-androideabi-g++ -shared \
-Wl,-soname,libmy_lib.so -o libmy_lib.so jni.o Client_Events.o Client_Wrapper.o \
libzmq.a libstdc++.a -Wl,--whole-archive
# Option 3 - Explicitly link ZeroMQ in dynamically
/opt/android-toolchain/bin/arm-linux-androideabi-g++ -shared \
-Wl,-soname,libmy_lib.so -o libmy_lib.so jni.o Client_Events.o Client_Wrapper.o \
-L /opt/android-root/lib/ -lzmq
对于这些选项中的每一个,我都尝试在加载我自己的库之前显式调用System.LoadLibrary("zmq")而不是。结果没有任何变化。使用 nm 可以确认,至少在选项 #2 的情况下,缺少的符号 *zmq_msg_init* 确实存在于 libmy_lib.so 中。
关于为什么找不到链接的 ZeroMQ 符号的任何想法?