Error:error: linker command failed with exit code 1 (use -v to see invocation)

最近在接GB28181的库,更新发现一个错误,搞了大半天,也查阅了大量资料,发现是ABIs(Android设备的CPU类型)的问题。

先看下日志截图:

点击左侧信息面板,弹出错误的详细信息如下:

2 warnings generated.
  [2/2] Linking CXX shared library ..\..\..\..\build\intermediates\cmake\debug\obj\arm64-v8a\libnative-lib.so
FAILED: cmd.exe /C "cd . && E:\android-ndk-r16b-windows-x86_64\android-ndk-r16b\toolchains\llvm\prebuilt\windows-x86_64\bin\clang++.exe  --target=aarch64-none-linux-android --gcc-toolchain=E:/android-ndk-r16b-windows-x86_64/android-ndk-r16b/toolchains/aarch64-linux-android-4.9/prebuilt/windows-x86_64 --sysroot=E:/android-ndk-r16b-windows-x86_64/android-ndk-r16b/sysroot -fPIC -isystem E:/android-ndk-r16b-windows-x86_64/android-ndk-r16b/sysroot/usr/include/aarch64-linux-android -D__ANDROID_API__=21 -g -DANDROID -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -Wa,--noexecstack -Wformat -Werror=format-security   -O0 -fno-limit-debug-info  -Wl,--exclude-libs,libgcc.a -Wl,--exclude-libs,libatomic.a --sysroot E:/android-ndk-r16b-windows-x86_64/android-ndk-r16b/platforms/android-21/arch-arm64 -Wl,--build-id -Wl,--warn-shared-textrel -Wl,--fatal-warnings -Wl,--no-undefined -Wl,-z,noexecstack -Qunused-arguments -Wl,-z,relro -Wl,-z,now -shared -Wl,-soname,libnative-lib.so -o ..\..\..\..\build\intermediates\cmake\debug\obj\arm64-v8a\libnative-lib.so CMakeFiles/native-lib.dir/src/main/cpp/native-lib.cpp.o  ../../../../src/main/jniLibs/arm64-v8a/lib28181.a ../../../../src/main/jniLibs/arm64-v8a/libmxml.a ../../../../src/main/jniLibs/arm64-v8a/libuuid.a -llog -latomic -lm "E:/android-ndk-r16b-windows-x86_64/android-ndk-r16b/sources/cxx-stl/gnu-libstdc++/4.9/libs/arm64-v8a/libgnustl_static.a" && cd ."
../../../../src/main/jniLibs/arm64-v8a/lib28181.a: error adding symbols: File in wrong format
  clang++.exe: error: linker command failed with exit code 1 (use -v to see invocation)
  ninja: build stopped: subcommand failed.

 上述代码最重要的信息就是error adding symbols: File in wrong format,就是文件格式错误,对应的文件下是arm64-v8a。

说说JNI里不同的ABIs区别:

arm64-v8a:第8代、64位ARM处理器,很少设备,三星 Galaxy S6是其中之一;

armeabi-v7a:第7代及以上的 ARM 处理器。2011年15月以后的生产的大部分Android设备都使用它;

armeabi:第5代、第6代的ARM处理器,早期的手机用的比较多;

总的来说,arm64-v8a是最新的,可以向下兼容,查了相关资料,具体解析如下:

如果你有两个文件夹armeabi和arm64-v8a,两个文件夹,armeabi里面有a.so 和 b.so,arm64-v8a里面只有a.so,那么arm64-v8a的手机在用到b的时候发现有arm64-v8a的文件夹,发现里面没有b.so,就报错了,所以这个时候删掉arm64-v8a文件夹,这个时候手机发现没有适配arm64-v8a,就会直接去找armeabi的so库,所以要么你别加arm64-v8a,要么armeabi里面有的so库,arm64-v8a里面也必须有(以上解析出处为https://www.zhihu.com/question/36893314/answer/78467097 )

解决方案有两个:

1:直接删掉 arm64-v8a文件夹;

2:在build.gradle下的ndk处删掉arm64-v8a,以使其不编译:

ndk {
        abiFilters "armeabi-v7a"//, "arm64-v8a"
    }

对于方案2,只是针对上述错误日志的处理方法,如果上述日志提示是其他的库文件格式错误,则要其注释其他的库。

还有其他方案,如向第三方重新编译正确的过来~~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值