2015-07-19 64 views
1

我幾乎讀了關於該主題的幾乎每個關於stackoverflow的問題。 我瀏覽了其他正在使用AS + NDK + gradle構建其他應用程序將包含的aar的其他人的文檔和工作筆記。Android Studio,gradle,ndk,aar和幾個本地共享庫的包含

我能夠在不同的多項目設置中構建.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 

這是相當複雜的,我希望專家會幫助簡化。

謝謝!

回答

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 << 
+0

這是更方便通過操縱'tasks'收集禁用本地構建和保持'srcDirs'輕鬆導航的C++文件和他們的頭,見例如http://stackoverflow.com/a/32640823/192373 –

相關問題