我目前正在开发一个针对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
答案 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。