我正在尝试构建一个调用C++后端的Android应用程序。此后端使用ZeroMQ进行消息传递。根据ZeroMQ指南上的 Android构建页面,我已经构建了一个ndk版本6的本地工具链,并成功构建了ZeroMQ。
然而,当我使用JNI实现构建自己的.so文件时,似乎无法使一切都正确加载。具体来说,如果我调用System.LoadLibrary("zmq"),则会成功完成,但是如果我随后调用*System.LoadLibrary("my_lib")*,我总是会收到UnsatisfiedLinkError的投诉:
然而,当我使用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符号?