android studio构建报“so is not an ABI”?

作者站长头像
站长
· 阅读数 120

我尝试用android(java)调用so库文件,gradle(kotlin DSL, version 6.0)编译的时候, 出现一下问题:

* What went wrong:
Execution failed for task ':app:mergeDebugNativeLibs'.
> out extracted from path E:\proj\android\MyApplicationWithJava\app\build\intermediates\merged_jni_libs\debug\mergeDebugJniLibFolders\out\libhello.so is not an ABI

goole了一下,可能有几个方面导致这个问题的出现1 so文件和设备的ABI不一致android studio构建报“so is not an ABI”?

2 gradle的配置问题android studio构建报“so is not an ABI”?

上面都尝试了,并不能解决这个问题。

另外,我的so库文件是通过手动命令编译的,不是通过项目,命名如下:

g++ -m64 com_shinja_jni_HelloJNI.cpp -fPIC -shared -o libhello1.so -I D:\app\code\jdk\jdk17\include -I D:\app\code\jdk\jdk17\include\win32
说明:
system: win10
jdk: 17
android studio: 2024.1.1
android SDK: 34
gradle: 6.0
g++:(Rev6, Built by MSYS2 project) 13.2.0

非常感谢您的回答!

回复
1个回答
avatar
test
2024-07-18

已解决,问题如下1 gradle的配置jniLibs.srcDirs = ['src/main/jniLibs']是告诉构建工具从该目录下找库文件,如果是x86_64架构就从src/main/jniLibs/x86_64目录下找,搜索格式是src/main/jniLibs/{abi}。所以应该手动建一个x86_64目录,将库文件放进去。(使用cmake工具应该会自动创建,没试过猜测)

继续后面的调用过程还发现几个问题,这里补充下:1 手动编译库文件时使用的标准的g++,应该使用ndk里的c++编译工具,否则会出现 xxx.so has bad ELF magic (x86_64的magic number是7F 45 4C 46)。

D:\app\code\Android\SDK\ndk\27.0.11902837\toolchains\llvm\prebuilt\windows-x86_64\bin\x86_64-linux-android24-clang++ -m64 -shared -o libhello.so -fPIC com_shinja_jni_HelloJNI.cpp

2 构建通过,运行时应用程序崩溃,logcat也没有报错日志,调试发现报错java.lang.UnsatisfiedLinkError: dlopen failed: library "libc++_shared.so" not found,应该是自己的库依赖了标准库libc++_shared.so,手动解决依赖的办法是将libc++_shared.so复制到src/main/jniLibs/x86_64下面。注意标准库的abi,选择对应的。

回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容