5

Я пытаюсь создать учебники, которые входят в комплект gstreamer-sdk-android-arm-debug-2013.6. Файл Android.mk в каталоге src/jni (проект учебника 1) ссылается на переменные окружения, такие как GSTREAMER_SDK_ROOT. Из того, что я прочитал, Android Studio не использует/пропускает переменные среды для скриптов сборки. Существует ли наилучшая практика для модификации make-файлов и для определения/получения пар ключ/значение, необходимых для скриптов сборки?Не удается построить обучающие материалы GStreamer с помощью Android Studio

+0

Android Studio не может работать с Make-файлами, поэтому вам нужно будет настроить файлы сборки Gradle, если вы хотите использовать их как нечто большее, чем текстовый редактор. –

+0

Я использую make-файлы с Android Studio для компонента ndk в других проектах, таких как mupdf, и он отлично работает. Единственная проблема, которую я вижу, - это эти переменные среды, используемые Android.mk для учебников GStreamer. Я мог бы жестко кодировать значения в файлах Android.mk, и я уверен, что он будет строить, но я предполагаю, что есть лучший способ. – svenyonson

+0

Тем не менее, если есть способ конвертировать эти учебные пособия, чтобы использовать только файлы сборки Gradle, я буду для него все - но не знаю с чего начать. – svenyonson

ответ

4

Хорошо, у меня есть рабочее решение. Вы МОЖЕТЕ передавать переменные среды в ndk-build (или любой другой процесс, порожденный gradle Exec). В моем случае я хотел установить их для задач clean и build. Это делается с использованием tasks.withType(Exec). Параметр среды задается здесь для всех задач Exec.

Для GSTREAMER_SDK_ROOT, я добавил запись в local.properties:

gst.dir=/Users/svenyonson/sdk/gstreamer-sdk-android-arm-debug-2013.6

Для PATH, я использовал по умолчанию для порожденного процесса и добавил, что мне нужно.

Вот рабочая версия build.gradle:

apply plugin: 'com.android.application' 

android { 
    compileSdkVersion 19 
    buildToolsVersion "20.0.0" 

    defaultConfig { 
     applicationId "com.gst_sdk_tutorials.tutorial_1" 
     minSdkVersion 19 
     targetSdkVersion 19 
    } 

    sourceSets.main { 
     jni.srcDirs = [] 
     jniLibs.srcDir 'src/main/libs' 
     java.srcDirs += 'src/main/jni/src' 
    } 

    tasks.withType(Exec) { 

     def localProperties = new Properties() 
     localProperties.load(project.rootProject.file('local.properties').newDataInputStream()) 
     def gstDir = localProperties.getProperty('gst.dir') 

     environment = [:] 
     environment['PATH'] = System.getenv("PATH")+ ":/usr/local/bin" 
     environment['GSTREAMER_SDK_ROOT'] = gstDir 
    } 


    task buildNative(type: Exec, description: 'Compile JNI source via NDK') { 

     def ndkDir = project.plugins.findPlugin('com.android.application').getNdkFolder() 
     commandLine "$ndkDir/ndk-build", 
      '-C', file('src/main/jni').absolutePath, 
      '-j', Runtime.runtime.availableProcessors(), 
      'all', 
      'NDK_DEBUG=1', 
      'V=1', 
      'APP_PLATFORM=android-19' 

    } 

    task cleanNative(type: Exec, description: 'Clean JNI object files') { 
     def ndkDir = project.plugins.findPlugin('com.android.application').getNdkFolder() 
     commandLine "$ndkDir/ndk-build", 
      '-C', file('src/main/jni').absolutePath, 
      'clean' 
    } 

    clean.dependsOn 'cleanNative' 

    tasks.withType(JavaCompile) { 
     compileTask -> compileTask.dependsOn buildNative 
    } 

    buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' 
     } 
    } 
} 

Проект в настоящее время строит и работает. Единственные другие вещи, которые нужно будет сделать, это добавить ndk.dir к local.properties:

sdk.dir=/Users/svenyonson/sdk/android-sdk 
ndk.dir=/Users/svenyonson/sdk/android-ndk-r9d 
gst.dir=/Users/svenyonson/sdk/gstreamer-sdk-android-arm-debug-2013.6 

Еще одна вещь: Эти примеры не будут строить, используя android-ndk-r10d. Обязательно используйте android-ndk-r9d.