【问题标题】:How do I add a "something.a" library file to my C++ Android Gradle project?如何将“something.a”库文件添加到我的 C++ Android Gradle 项目?
【发布时间】:2025-12-01 17:30:01
【问题描述】:

我有一个名为 somelibrary/lib/c++/armeabi-v7a/libsomelibrary.a 的库。如何将其添加到我的 Android 项目中的 Gradle 文件中?

显然,该库还包含 somelibrary/include/somelibrary/*.h 下的标头,但这是简单的部分,因为我只需在 build.gradle 中添加一行 cppFlags.addAll(['-I' + file('somepath/somelibrary/include')])

但是如何将 .a 文件添加到项目中,以便链接适用于所有二进制格式,不仅包括 armeabi-v7a,还包括 arm64-v8a、armeabi 和 x86?该库包含所有这些二进制格式的 .a 文件版本。除此之外,它还包含两个不同的 c++ 标准库的版本:“c++”和“gnustl”。我没有库的源代码。

【问题讨论】:

标签: android c++ android-studio gradle android-ndk


【解决方案1】:

这取决于使用的 gradle 版本,如果是 build:gradle-experimental:0.7.3'

在app build.gradle文件中:

  • 首先定义你的库存储库

    repositories {
        libs(PrebuiltLibraries) {
            your_lib {
               headers.srcDir "${your_lib_path}/include"
               binaries.withType(StaticLibraryBinary) {
               staticLibraryFile =   file("${your_lib_path}/your_library.a")
                }
            }
      }
    }
    
  • 定义你的 ndk 模块

      android.ndk 
      {
        moduleName = "your_ndk_module"
        platformVersion = 9
        toolchain "gcc"
        debuggable true
        cppFlags.add("-fexceptions")
        cppFlags.add("-std=c++11")
        stl = "gnustl_static" 
      }
    
  • 定义库源

    android.sources {
    
    main {
    
        jni {
             dependencies {
                          library "your_lib" linkage "static"
                 }                  
            }
        }
     } 
    
  • 定义您的产品风味

     android.productFlavors 
       {
    
    
                    create("arm") {
                        ndk.abiFilters.add("armeabi")
                        ndk.ldFlags.add("-L${file('src/main/jniLibs/armeabi')}".toString())
                        ndk.ldLibs.addAll(["your_lib"])
    
                    }
                    create("arm7") {
                        ndk.abiFilters.add("armeabi-v7a")
                        ndk.ldFlags.add("-L${file('src/main/jniLibs/armeabi-v7a')}".toString())
                        ndk.ldLibs.addAll(["your_lib"])
    
                    }
                    create("arm8") {
                        ndk.abiFilters.add("arm64-v8a")
                        ndk.ldFlags.add("-L${file('src/main/jniLibs/arm64-v8a')}".toString())
                        ndk.ldLibs.addAll(["your_lib"])
                    }
     }
    

完整代码:

apply plugin: 'com.android.model.application'

def your_lib_path = file(project(':app').projectDir).absolutePath + "/your_lib_path"
model {
    repositories {
        libs(PrebuiltLibraries) {
            your_lib {
                headers.srcDir "${your_lib_path}/include"
                binaries.withType(StaticLibraryBinary) {
                    staticLibraryFile = file("${your_lib_path}/your_library.a")
                }
            }
      }
  }
  //define your ndk-module: 
  android.ndk {
       moduleName = "your_ndk_module"
       platformVersion = 9
       toolchain "gcc"
       debuggable true
       cppFlags.add("-fexceptions")
       cppFlags.add("-std=c++11")
       stl = "gnustl_static" // Which STL library to use: gnustl or stlport
       }
  //define your android sources
  android.sources {
       main {
           jni {
               dependencies {
                   library "your_lib" linkage "static"
               }
           }
       }
   }

//define your product flavours: 
android.productFlavors {
        // for detailed abiFilter descriptions, refer to "Supported ABIs" @
        // https://developer.android.com/ndk/guides/abis.html#sa
        create("arm") {
            ndk.abiFilters.add("armeabi")
            ndk.ldFlags.add("-L${file('src/main/jniLibs/armeabi')}".toString())
            ndk.ldLibs.addAll(["your_lib"])

        }
        create("arm7") {
            ndk.abiFilters.add("armeabi-v7a")
            ndk.ldFlags.add("-L${file('src/main/jniLibs/armeabi-v7a')}".toString())
            ndk.ldLibs.addAll(["your_lib"])

        }
        create("arm8") {
            ndk.abiFilters.add("arm64-v8a")
            ndk.ldFlags.add("-L${file('src/main/jniLibs/arm64-v8a')}".toString())
            ndk.ldLibs.addAll(["your_lib"])
        }
    }

  }

你必须根据你的 gradle 版本修改你的 gradle 文件。

希望,这会有所帮助。

干杯。

乌奈。

【讨论】:

  • 谢谢,这可能是一个完美的答案。唯一的问题是 Android Studio 刚刚用 c++ 切换到了 CMake,这不再有帮助了......