运行./gradlew buildNative传递,但gradle构建没有

时间:2016-06-21 22:06:10

标签: android android-ndk

我目前正在开发一个针对Android的nbk项目。我在build.gradle中有当前命令,因此我可以从我的gradle包装器构建:

def ndkDir = "/Development/android-sdk-macosx/ndk-bundle"
task buildNative(type: Exec, description: 'Compile JNI source via NDK') {
    commandLine "$ndkDir/ndk-build",
            '-C', file('src/main/jni').absolutePath,
            '-j', Runtime.runtime.availableProcessors(),
            'all',
            'NDK_DEBUG=1'
}

task cleanNative(type: Exec, description: 'Clean JNI object files') {
    commandLine "$ndkDir/ndk-build",
            '-C', file('src/main/jni').absolutePath,
            'clean'
}

我可以使用./gradlew buildNative进行构建,但是当我尝试gradle assembleDebug时,我会收到错误:

compiling TextRenderer.cpp failed.
/Users/user/android-ndk/san-angeles/app/src/main/jni/src/Renderers/TextRenderer.cpp:5:10: fatal error: 'ft2build.h' file not found
#include <ft2build.h>
         ^
1 error generated.

compiling BoxRenderer.cpp successful.

compiling triangle.cpp successful.

Finished compileSanangelesArmeabi-v7aDebugSharedLibrarySanangelesMainCpp, see full log file:///Users/user/android-ndk/san-angeles/app/build/tmp/compileSanangelesArmeabi-v7aDebugSharedLibrarySanangelesMainCpp/output.txt.

我使用的是一个freetype库,我交叉编译了问题,但我得到了它通过那一点(我认为): Was able to cross compile Freetype2, now what?

编辑:

我已将我的gradle构建更改为:

apply plugin: 'com.android.model.application'
model {
    android {
        ...
        sourceSets.main {
            jniLibs.srcDir 'src/main/jni/freetype/lib'
            jni.srcDirs = []
        }
        ...
    }
}
task buildNative (...){
    ...
}
task cleanNative (...){
    ...
}

但现在我收到了这个错误:

Gradle sync failed: Cause: com.android.build.gradle.managed.AndroidConfig$Impl

1 个答案:

答案 0 :(得分:2)

如果您不想为experimental gradle插件的不断变化的C ++支持而烦恼,您只需使用Android Studio生成的 build.gradle 即可。要禁用 jni 文件夹中的C ++文件的自动编译,您可以覆盖 jni.srcDirs

jni.srcDirs = []
jniLibs.srcDir 'src/main/jni/freetype/lib'

我在此处覆盖 jniLibs.srcDir ,以便使用 ndk-build 编译的库将包含在APK文件中。

实际上,我更喜欢让 jni.srcDirs 指向我的C ++文件(这样,我不需要运行其他IDE来使用它们),并且我禁用了gradle任务(某处)在 build.gradle 文件中:

tasks.all {
    task -> if (task.name.contains('compileDebugNdk') ||
                task.name.contains('compileReleaseNdk'))
                   task.enabled = false
}

我还可以教系统在必要时运行buildNative和cleanNative:

tasks.withType(JavaCompile) {
    compileTask -> compileTask.dependsOn buildNative
}

clean.dependsOn cleanNative

请注意下一版Android Studio 2.2(现已公开测试版),makes ndk-build a first class citizen