问题遇到的现象和发生背景
Android版本:R
abi:arm64-v8a
芯片:高通8155
报错库:自己在ubuntu中交叉编译zeromq得到的Android库
android交叉编译工具链:android-ndk-r24
问题描述:在APK中java侧通过System.loadLibrary加载so,但是在运行时报了错误,
java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "__aarch64_ldadd4_relax" referenced by "/data/app/~~7M30PxbA5TZn2HmzOnoe1w==/com.test.example-x0DRbnJHKw-KSA9-1Mk9rg==/base.apk!/lib/arm64-v8a/libzmq.so"...
问题相关代码
交叉编译指令:
export ANDROID_NDK_ROOT=~/toolchain/android-ndk-r24
export MIN_SDK_VERSION=28
./build.sh arm64
dev05@hello-PowerEdge-R740:~//libzmq$ find ./ -name *.so | xargs nm -D | grep ldadd
U __aarch64_ldadd4_acq
U __aarch64_ldadd4_acq_rel
U __aarch64_ldadd4_rel
U __aarch64_ldadd4_relax
U __aarch64_ldadd8_acq_rel
U __aarch64_ldadd8_relax
U __aarch64_ldadd4_acq
U __aarch64_ldadd4_acq_rel
U __aarch64_ldadd4_rel
U __aarch64_ldadd4_relax
U __aarch64_ldadd8_acq_rel
U __aarch64_ldadd8_relax
运行结果及报错内容
java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "__aarch64_ldadd4_relax" referenced by "/data/app/~~7M30PxbA5TZn2HmzOnoe1w==/com.test.example-x0DRbnJHKw-KSA9-1Mk9rg==/base.apk!/lib/arm64-v8a/libzmq.so"...
编译没有问题,apk在运行时,dlopen ndk的so,报错找不到__aarch64_ldadd4_relax
我的解答思路和尝试过的方法
之前在网上查找说,默认开启了-moutline-atomics,但是我使用的交叉编译命令是zeromq自带的,没有去修改CMakeLists.txt。。
另外网上说__aarch64_ldadd4_acq_rel在libgcc.a中,我将libgcc.a依赖进入到jni lib中,运行仍然报上面的错误。
我想要达到的结果
1、上述问题产生的原因
2、能够在Android中运行zeromq。