当前位置: 首页 > 知识库问答 >
问题:

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

仲孙鸣
2024-07-16

我尝试用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个答案

司空俊悟
2024-07-16

问题分析

您遇到的错误“out extracted from path ... libhello.so is not an ABI”通常表明Android构建系统无法识别或正确处理提供的.so文件。这通常是因为.so文件与Android平台预期的ABI(应用程序二进制接口)不匹配。

在您的情况下,问题可能是由于以下几个原因:

  1. ABI不匹配:您使用g++ -m64编译的libhello1.so是针对64位系统的,但Android设备通常使用ARM或ARM64架构。因此,您应该为Android编译正确的ABI版本。
  2. 手动编译的SO文件:您手动编译的.so文件可能不包含Android所需的元数据或签名,这可能导致构建系统无法识别它。
  3. Gradle配置问题:尽管您提到已经检查了Gradle配置,但确保您的build.gradle文件中正确配置了NDK和CMake(如果您正在使用它)以处理原生库。

解决方案

  1. 使用NDK编译SO文件
    使用Android NDK(Native Development Kit)来编译您的原生库。NDK包含了一组工具,用于在Android平台上编译C和C++代码。您可以使用CMake或ndk-build作为构建系统。

    以下是一个使用CMake的基本示例CMakeLists.txt

    cmake_minimum_required(VERSION 3.4.1)
    
    add_library(hello-jni SHARED com_shinja_jni_HelloJNI.cpp)
    
    find_library(log-lib log)
    
    target_link_libraries(hello-jni ${log-lib})

然后,在您的build.gradle文件中配置CMake:

android {
    ...

    defaultConfig {
        ...

        externalNativeBuild {
            cmake {
                cppFlags ""
            }
        }
    }

    externalNativeBuild {
        cmake {
            path "src/main/jni/CMakeLists.txt"
            version "3.10.2"
        }
    }
}
  1. 确保SO文件是针对正确的ABI
    使用NDK编译时,确保为Android设备支持的ABI(如armeabi-v7a、arm64-v8a、x86、x86_64)编译库。
  2. 检查Gradle配置
    再次检查您的build.gradle文件,确保没有遗漏或错误的配置。
  3. 清理和重建项目
    在Android Studio中,尝试“Clean Project”和“Rebuild Project”来确保所有构建文件和缓存都是最新的。
  4. 检查SO文件是否损坏
    使用文件检查工具或尝试在不同的Android项目中使用相同的SO文件来确保文件本身没有损坏。

遵循上述步骤后,您应该能够解决“is not an ABI”的错误,并成功地在Android应用程序中集成您的原生库。

 类似资料:
  • gradle构建错误: Build file 'D:\movierecommend\build.gradle' line: 33 A problem occurred evaluating root project 'movie-recommend'. org.gradle.api.internal.artifacts.publish.ArchivePublishArtifact.<init>(L

  • 我试图在android studio上使用java 1.7版,但不幸的是,它不能正常工作。。。如果在

  • 我运行的是Mac OSX,我安装了android Studio-它启动正常。 问题1 我用一个空活动开始一个新项目。在最上面的窗户上我收到一条信息 问题2 我在底部窗口中看到以下错误: 错误:CompilesDKVersion android-L需要使用JDK 7 Open SDK Settings进行编译 打开文件 当我尝试在设备上运行项目时,我得到以下错误: 失败[INSTALL_FAILED

  • 救急,我導入的maven項目怎麽構建報錯,我自己下了jdk但是好像他構建用的不是我下載的,我又不知道怎麽更換 環境變量也設置了,但是他用的不是我下載和設置的jdk,我安裝在D盤,他用的是D盤的jdk,求大佬解答 ======== 上面的問題解決了但是還是報錯:

  • 问题内容: 我正在尝试在Android Studio中使用Java版本1.7,但是很遗憾,它无法正常工作…如果将版本设置为 但是,当我使用带有字符串的声明语句时,出现了在Java 1.7中应该发生的错误,因此我是否需要设置其他设置? 问题答案: 不,没有设置可更改。Android SDK不支持完整的Java 7语法,因此您不能使用它。 请注意,最新的android版本支持java.nio。*(ja

  • 现在让我们看一个典型的多项目构建. 下面是项目的布局: Example 7.10. 多项目构建 - 分层布局 构建布局 multiproject/ api/ services/webservice/ shared/ 注意: 这个例子的代码可以在 samples/java/multiproject 里找到. 现在我们能有三个项目. 项目的应用程序接口 (API) 产生一个 JAR 文件,