我尝试用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不一致
2 gradle的配置问题
上面都尝试了,并不能解决这个问题。
另外,我的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 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,选择对应的。