我几乎通读了 stackoverflow 中关于该主题的几乎所有问题。 我浏览了其他使用 AS + NDK + gradle 构建将被其他应用程序包含的 aar 的人的文档和工作笔记。
我能够在不同的多项目设置中构建 .so,其中的结构与在一个方面显示的结构不同:它没有第一个 jni/层。
我添加了那个额外的 jni 层,这样我就有了一个 sharedObjectLib#2/层次结构。在那个 jni/目录中,我只有一个 Android.mk,其唯一目的是包含 $(调用 all-subdir-makefiles)。在我这样做之后,gradle build 报告 NDK 失败:
“错误:(89) Android NDK:警告:此项目中没有要构建的模块!”
我似乎无法做的是构建多个共享对象“.so”作为 aar 的一部分。
我真的很想知道 (a) 它是否可行; (b) 一些指向实际执行此操作的 gradle.build 文件的链接和/或示例的指针。
这是我目前拥有的结构 - 跳过由 Android Studio(v. 1.2.2,顺便说一句)创建的常用目录。
--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
比较复杂,希望高手帮忙简化。
谢谢!
最佳答案
我正在使用 1.2.2,发现构建简单的 NDK 项目很容易 从四处流传的许多教程中,但令人沮丧地困难 构建任何复杂的 NDK 项目。我会总结我的 找到了,但我强烈建议阅读 this blog 和 this StackOverflow .
我发现Android Studio会完全忽略
我创建的 Android.mk 文件,而是自动生成它自己的文件。
为了纠正这个问题,我必须首先破解 build.gradle
我项目的脚本,位于 project/app/build.gradle
。
如果需要,您可能会破解顶级 build.gradle。
这可能就是您的情况。自动生成的 Android.mk 在 jni/中查找 .c 源文件,但一无所获 那里。
这是我的build.gradle。我在 Windows 机器上构建,所以我破解了它 仅限 window 。如果您使用的是 OSX 或 Linux,请取消注释这些行。
项目/app/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 <<
关于Android Studio、gradle、ndk、aar 和几个原生共享库的包含,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31498379/