Android Studio,gradle,ndk,aar以及包含多个本机共享库

时间:2015-07-19 05:48:22

标签: android android-studio android-ndk android-gradle

我几乎阅读了有关该主题的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

它非常复杂,我希望专家能帮助简化。

谢谢!

1 个答案:

答案 0 :(得分:2)

我正在使用1.2.2,发现构建简单的NDK项目很容易 从许多浮动的教程,但令人沮丧的困难 构建任何复杂的NDK项目。我将总结一下我的情况 发现,但我强烈建议阅读 this blogthis 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 <<