2014-12-17 31 views
5

Próbuję zbudować samouczki połączone z gstreamer-sdk-android-arm-debug-2013.6. Plik Android.mk w katalogu src/jni (projekt samouczka 1) odwołuje się do zmiennych środowiskowych, takich jak GSTREAMER_SDK_ROOT. Z tego, co przeczytałem, Android Studio nie używa zmiennych środowiskowych do skryptów budujących. Czy istnieje najlepsza praktyka modyfikacji plików Makefile i definiowania/pobierania par klucz/wartość wymaganych przez skrypty budowania?Nie można utworzyć samouczków GStreamer za pomocą Android Studio

+0

Android Studio nie działa z plikami Makefile, więc będziesz musiał skonfigurować pliki kompilacji Gradle, jeśli chcesz używać go jako coś więcej niż edytor tekstu. –

+0

Używam plików Makefile z Androidem Studio dla komponentu ndk w innych projektach, takich jak mupdf i działa dobrze. Jedyny problem jaki widzę, to te zmienne środowiskowe używane przez system Android.mk do samouczków GStreamer. Mogę ciężko zakodować wartości w plikach Android.mk i jestem prawie pewny, że to by powstało - ale domyślam się, że jest lepszy sposób. – svenyonson

+0

To powiedziawszy, jeśli istnieje sposób na konwersję tych samouczków, aby używać tylko plików kompilacji Gradle, byłbym na to gotowy - ale nie wiem od czego zacząć. – svenyonson

Odpowiedz

4

Ok, mam działające rozwiązanie. MOŻESZ przekazać zmienne środowiskowe do ndk-build (lub dowolnego innego procesu spawnowanego przez gradle Exec). W moim przypadku chciałem ustawić je dla zadań clean i build. Robi się to przy użyciu tasks.withType(Exec). Parametr środowiska jest tutaj ustawiony dla wszystkich zadań Exec.

Dla GSTREAMER_SDK_ROOT dodałem wpis do local.properties:

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

Dla PATH użyłem domyślne dla zrodził proces i dodaje w to, co potrzebne.

Oto wersja robocza 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' 
     } 
    } 
} 

Projekt teraz buduje i działa. Tylko inne rzeczy trzeba zrobić, to dodać ndk.dir do 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 

jeszcze jedno: te przykłady nie będą budować za pomocą android-ndk-r10d. Pamiętaj, aby użyć android-ndk-r9d.