我们如何使用新的基于 NDK gradle 的构建器定义多个模块?

Jon*_*ona 5 android android-ndk android-gradle-plugin

我正在尝试学习并尝试使用新的基于 Android Studio gradle 的 ndk 构建支持。

我很难弄清楚如何定义 PREBUILT_SHARED_LIBRARY ndk 模块,以便我的主 ndk 模块可以使用它。我使用 Android.mk 进行了这些设置,但不知道如何将其转换为 gradle。:/

// SHARED LIBRARY
android.ndk {
    moduleName = "skia_android"
    cppFlags += "-I${file("src/main/jni/skia/skia/out/config/android-nexus_4/Debug/lib/libskia_android.so")}".toString()
    cppFlags += "-I${file("src/main/jni/skia/skia/include/core")}".toString()
    cppFlags += "-I${file("src/main/jni/skia/skia/include/utils")}".toString()
    cppFlags += "-I${file("src/main/jni/skia/skia/include/gpu")}".toString()
    cppFlags += "-I${file("src/main/jni/skia/skia/include/private")}".toString()
    ldLibs += ["EGL", "GLESv2"]
    stl    = "c++_static"
}

// MAIN LIBRARY
android.ndk {
    moduleName = "smasher"
    cppFlags += "-I${file("src/main/jni/smasher/include")}".toString()
    cppFlags += "-I${file("src/main/jni/smasher/src")}".toString()
    cppFlags += "-I${file("src/main/jni/smasher")}".toString()
    ldLibs += ["skia_android", "log", "android", "EGL", "GLESv2"]
    stl    = "c++_static"
    abiFilter "armeabi-v7a"
}
Run Code Online (Sandbox Code Playgroud)

Ale*_*ohn 1

更新(2016 年 2 月):实验插件现在允许本机模块还不是主要的。


不幸的是,当前的 gradle 插件不支持这一点。具体来说,目前无法定义纯本机模块。我建议保留传统的Android.mk,它可以可靠地完成这项工作。

诀窍是禁用常规 NDK 构建任务,并注入一个buildNative任务:

Properties properties = new Properties()
properties.load(project.rootProject.file('local.properties').newDataInputStream())
def ndkBuild = properties.getProperty('ndk.dir') + '/ndk-build'

import org.apache.tools.ant.taskdefs.condition.Os
if (Os.isFamily(Os.FAMILY_WINDOWS)) {
    ndkBuild += '.cmd'
}

task buildNative(type: Exec, description: 'Compile JNI source via NDK') {
    commandLine '$ndkBuild', 'NDK_PROJECT_PATH="$jniSrc/..'
}

task cleanNative(type: Exec, description: 'Clean JNI object files') {
    commandLine '$ndkBuild', 'clean', 'NDK_PROJECT_PATH="$jniSrc/..'
}

clean.dependsOn 'cleanNative'

tasks.all {
    task ->
        if (task.name.startsWith('compile') && task.name.contains('MainC')) {
            task.enabled = false
        }
        if (task.name.startsWith('link')) {
            task.enabled = false
        }
        if (task.name.endsWith("SharedLibrary") ) {
            task.dependsOn buildNative
        }
}
Run Code Online (Sandbox Code Playgroud)