我几乎阅读了有关该主题的stackoverflow中的几乎所有问题。 我浏览了其他使用AS + NDK + gradle构建其他应用程序的人员的文档和工作说明。
我能够在不同的多项目设置中构建.so,其结构与一个方面所示的结构不同:它没有第一个jni /层。
我添加了额外的jni层,以便我有一个sharedObjectLib#2 /层次结构。在那个jni / dir中,我只有一个Android.mk,其唯一目的是包含$(调用all-subdir-makefiles)。在我这样做之后,gradle build报告NDK失败:
"错误:(89)Android NDK:警告:此项目中没有要构建的模块!"
我能做的似乎是构建多个共享对象' .so'作为aar的一部分。
我真的想知道(a)它是否可行; (b)指向实际执行此操作的gradle.build文件的链接和/或示例的一些指针。
这是我目前的结构 - 跳过Android Studio创建的常用目录(v.1.2.2,btw)。
--rootProject/
--build.gradle
--gradle.properties
--local.properties
--settings.gradle
--rootProject.iml
--app/
--moduleProjectThatBuildsAAR/
--build.gradle
--build/
--libs
--src/
--main/
--res/
--AndroidManifest.xml
--jni/
--Android.mk (does include $(call all-subdir-makefiles))
--Application.mk
--sharedObjectLib#1/
--build.gradle
--src/
-- androidTest/
-- main/
--java/
--jni/
-- Android.mk
-- Application.mk
-- *.c and *.h files
--libs/
--obj/
-- build.gradle
它非常复杂,我希望专家能帮助简化。
谢谢!
答案 0 :(得分:2)
我正在使用1.2.2,发现构建简单的NDK项目很容易 从许多浮动的教程,但令人沮丧的困难 构建任何复杂的NDK项目。我将总结一下我的情况 发现,但我强烈建议阅读 this blog 和this StackOverflow。
我发现Android Studio会完全忽略它
我创建的Android.mk文件,而是自动生成自己的文件。
要纠正这个问题,我必须先破解 build.gradle
我的项目的脚本,位于project/app/build.gradle
。
如果需要,您可能会破解顶级build.gradle。
这可能就是你的情况。自动生成 Android.mk查找jni / for .c源文件并找不到任何内容 那里。
这是我的build.gradle。我建立在Windows机器上,所以我把它砍掉了 仅限Windows。如果您使用的是OSX或Linux,请取消注释行。
<强>项目/应用/的build.gradle:强>
//import org.apache.tools.ant.taskdefs.condition.Os
apply plugin: 'com.android.application'
android {
compileSdkVersion 22
buildToolsVersion "22.0.1"
defaultConfig {
applicationId "com.sample.app"
minSdkVersion 15
targetSdkVersion 22
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
//ENABLE CUSTOM ANDROID.MK >>
sourceSets.main.jni.srcDirs= [] //Disable automatic ndk-build.
sourceSets.main.jniLibs.srcDir 'src/main/libs'
//Call regular ndk-build script from app directory
task ndkBuild(type: Exec) {
workingDir file('src/main')
commandLine getNdkBuildCmd()
}
tasks.withType(JavaCompile) {
compileTask -> compileTask.dependsOn { ndkBuild }
}
task cleanNative(type: Exec) {
workingDir file('src/main')
commandLine getNdkBuildCmd(), 'clean'
}
clean.dependsOn cleanNative
}
//ENABLE CUSTOM ANDROID.MK <<
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:22.2.0'
compile 'com.google.android.gms:play-services:7.5.0'
}
//ENABLE CUSTOM ANDROID.MK >>
def getNdkDir() {
if (System.env.ANDROID_NDK_ROOT != null)
return System.env.ANDROID_NDK_ROOT
Properties properties = new Properties()
properties.load(project.rootProject.file('local.properties').newDataInputStream())
def ndkdir = properties.getProperty('ndk.dir', null)
if (ndkdir == null)
throw new GradleException("NDK location not found. Define location with ndk.dir in the local.properties file")
return (ndkdir)
}
def getNdkBuildCmd() {
def ndkbuild = getNdkDir() + "/ndk-build.cmd"
// def ndkbuild = getNdkDir() + "/ndk-build"
// if (Os.isFamily(Os.FAMILY_WINDOWS))
// ndkbuild += ".cmd"
return ndkbuild
}
//ENABLE CUSTOM ANDROID.MK <<