android studio构建报“so is not an ABI”?-灵析社区

中年复健狗

我尝试用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不一致 ![](https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20240920/45f1eead870e651bef86e47019cd2fbb.png) 2 gradle的配置问题 ![](https://wmprod.oss-cn-shanghai.aliyuncs.com/c/user/20240920/b91a18c2749dcbd4e794bb410158a0eb.png) 上面都尝试了,并不能解决这个问题。 另外,我的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 非常感谢您的回答!

阅读量:125

点赞量:0

问AI
已解决,问题如下 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,选择对应的。