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
Odpowiedz
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
.
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. –
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
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