使用android gradle experimental连接.aar文件中的.so文件

时间:2017-05-15 21:49:12

标签: android gradle android-ndk gradle-experimental

我正在使用android gradle实验插件来构建包含一些本机代码的app模块。这个本机代码使用带有预先构建的.so文件的库,我通过android库模块将其捆绑到.aar文件中。 .aar文件构建正常,但如何将应用程序模块中的本机代码模块链接到.aar模块中预先构建的.so文件? gradle实验文档没有提到这种情况。

另外,如果可能的话,我想在.aar文件中打包包含文件(尽管它们不应与最终应用程序一起打包)。

在/ prebuiltlib中:

build.gradle
-src/
--main/
---jniLibs/
----libfoo.so

以下是gradle文件:

/prebuiltlib/build.gradle

apply plugin: "com.android.model.library"
model {
    android {
        compileSdkVersion 25
        buildToolsVersion "25.0.3"

        defaultConfig {
            minSdkVersion.apiLevel = 21
            targetSdkVersion.apiLevel = 21
            versionCode 1
            versionName "1.0"

        }

        buildTypes {
            release {
                minifyEnabled false
                proguardFiles.add(file("proguard-rules.pro"))
            }
        }
    }
}

dependencies {
    compile fileTree(dir: "libs", include: ["*.jar"])
    compile "com.android.support:appcompat-v7:25.3.1"
}

这是/app/build.gradle,注意???在哪里我不知道该放什么:

import org.apache.tools.ant.taskdefs.condition.Os
apply plugin: 'com.android.model.application'

model {
    repositories {
        libs(PrebuiltLibraries) {
            // ??? is this right, and does this go into app/build.gradle or mylib/build.gradle?
            foo {
                binaries.withType(SharedLibraryBinary) {
                    sharedLibraryFile = file('???/libfoo.so')
                }
            }
        }
    }
    android {
        compileSdkVersion = 25
        buildToolsVersion = '25.0.3'

        defaultConfig {
            applicationId = 'com.jeremy.stackoverflow.sample'
            minSdkVersion.apiLevel = 21
            targetSdkVersion.apiLevel = 21
            versionCode = 1
            versionName = '1.0'
        }

        ndk {
            platformVersion = 21
            moduleName = 'native-activity'
            toolchain = 'gcc'
            toolchainVersion = '4.9'
            stl = 'gnustl_shared'
            abiFilters.add('armeabi-v7a')
            ldLibs.addAll(['log',
                           'android',
                           'EGL',
                           'GLESv2'
            ])
            // ??? How do I add include paths from the .aar module?
            cppFlags.add('-I' + file('???/include'))
            cppFlags.addAll(['-std=c++11', '-fexceptions'])
        }

        sources {
            main {
                jni {
                    dependencies {
                        // ??? Is this right?
                        library 'foo' linkage 'shared'
                    }
                }
                jniLibs {
                    source {
                        // ??? Do I need one of these for the libs in the .aar?
                        srcDir file('???/jniLibs')
                    }
                    dependencies {
                        // ??? Is this right?
                        library 'foo'
                    }
                }
            }
        }
        buildTypes {
            release {
                minifyEnabled = false
                proguardFiles.add(file('proguard-rules.pro'))
            }
        }
    }
}

dependencies {
    println rootProject.getName()
    compile fileTree(include: ['*.jar'], dir: 'libs')
    compile 'com.android.support:appcompat-v7:25.3.1'
    compile project(':prebuiltlib')
}

1 个答案:

答案 0 :(得分:0)

从Android Gradle Plugin 4.0开始,可以从build.gradle文件中链接的AAR导入C / C ++依赖关系。 Gradle会自动将其提供给本机构建系统使用,但是必须将构建系统配置为使用导入的库和头。

在gradle 4.0中:将以下内容添加到项目的gradle.properties文件中:

android.enablePrefab=true

在gradle 4.1中:将以下内容添加到模块的build.gradle文件的android块中:

buildFeatures {
  prefab true
}

,如果您的应用程序定义了libapp.so并使用了cURL,则您的CMakeLists.txt应包含以下内容:

add_library(app SHARED app.cpp)

# Add these two lines.
find_package(curl REQUIRED CONFIG)
target_link_libraries(app curl::curl)

app.cpp现在能够#include“ curl / curl.h”,在构建时libapp.so将自动与libcurl.so链接,而libcurl.so将包含在APK中。

来源:https://developer.android.com/studio/build/native-dependencies