Skip to content

[Android] How to build Android applications on Ubuntu

Geunsik Lim edited this page Feb 12, 2019 · 52 revisions

This manual is written for developing Android application (.apk) based on GStreamer. The manual is successfully evaluated and verified on Ubuntu 16.04 LTS x86_64 distribution. We assume that you dowload the required files into /var/www/gst-android/ folder.

Firewall setting

## Proxy setting to run Android Studio in the office
1. Proxy: File - Settings Appearance & Behavior - System Settings - HTTP Proxy 
2. SSL certificate: File - Settings - Tools - Server Certificates 
3. Check gradle.properties
systemProp.http.proxyHost=10.112.1.184
systemProp.http.proxyPort=8080
systemProp.https.proxyHost=10.112.1.184
systemProp.https.proxyPort=8080

How to run C/C++ NNStreamer application on Android stack w/o License issue

Step 0. gstreamer source ---> cerbero/NDK-xxb --> gst-android prebuilt files 
        dep-packs(88)-----/                          (*.a and *.h)


Step 1. gst-android prebuilt files (w/ header files) ------>  ndk-build  ------>  *.a 
        nnstreamer (*.c)     ---------------------------/     
      
      
Step 2. gst-android: *.a  --------------> ndk-build -----> (libnnstreamer-android.so)  
        nnstreamer : *.a  -------/                                                   
      
Step 3. Application

Step 3.1 CLI (NOW): nnstreamer-example source ------> ndk-build ---> C/C++ CLI app 
             (libnnstreamer-android.so) --------/

Step 3.2 GUI (FUTURE): nnstreamer-example source ----> gradle ---> Java/Kotlin GUI app 
             (libnnstreamer-android.so) ----------/  (Androd-Studio)

Step 4. Performance optimization

Setting of environment variables

Note that Android studio use 'Gradle' instead of 'ndk-build' command to build Android applications.

$ vi ~/.bashrc

## Gstreamr-Android prebuilt binary setting, gst-root-android
export GSTREAMER_ROOT_ANDROID=/var/www/gst-android/gst_root_android

## Android NDK/SDK setting
# export ANDROID_NDK=$HOME/Android/Sdk/ndk-bundle
export ANDROID_NDK=/var/www/gst-android/android-ndk-r16b
export PATH=$ANDROID_NDK:$PATH

export ANDROID_HOME=$HOME/Android/Sdk
export PATH=$PATH:$ANDROID_HOME
export ANDROID_SDK=$HOME/Android/Sdk

Pre-requisites

.apk: How to compile Android application source code

Cerbero: How to generate prebuilt binaries for gst-android

You can cross-compile GStreamer for Android from a Linux host using the configuration file 'config/cross-android.cbc'.

git clone https://gitlab.freedesktop.org/gstreamer/cerbero
cd cerbero
time ./cerbero-uninstalled  -c config/cross-android-arm64.cbc wipe
time ./cerbero-uninstalled -c config/cross-android-arm64.cbc bootstrap
time ./cerbero-uninstalled -c config/cross-android-arm64.cbc package gstreamer-1.0
ls -al *.tar.bz2 

Troubleshooting

  • Q: Install missing platform(s) and sync project

    • A: Just press a link to install required packages.
  • Q: Failed to update the version of the Android Gradle plugin.

    • A: Just press a link to install required packages.
  • Q: error: undefined reference to 'gst_plugin_coreelements_register'

    • A: You need to use 'gradle' of Android studio instead of 'nkd-build' command.
  • Q: 'gradle' command generates the "/usr/bin/ld.gold: error: cannot open crti.o: ..." error message

    • A: Do not install NDK in the Android Studio. Note that you must use NDK r16b (old version) instead of latest version such as NDK r18b/ndk-bundle of Android Studio). Please specify NDK path at "File - Project Structure - SDK Location - Android NDK Location".
  • Q: Can we generate .apk on the Ubuntu console?

    • A: Sure, Please refer to https://developer.android.com/studio/build/building-cmdline. If you have to write just C/C++ source code, please use 'ndk-build' command. If you have to develop JNI-based JAVA GUI applications, you can use 'gradlew' command on Ubuntu console.
    • A: Note that ndk-build use jni/Android.mk. However, gradlew use build.gradle file without the existing jni/Android.mk.
    $ cd gst-docs/examples/tutorials/android/android-tutorial-1
    $ ndk-build
    $ ../gradlew build -Dorg.gradle.java.home=/var/www/gst-android/android-studio/jre
    $ find ./build/output/apk/ -name *.apk
    $ adb install -r {path-to-your-bild-folder}/{yourAppName}.apk
    $ ../gradlew clean
    
  • Q: Android emulator on AWS/X86_64 EC2 (Your CPU does not support required features (VT-x or SVM).

  • Q: Cannot generate armeabi and mips libraries

    • A: Officially, NDK r18b does not support out-of-date CPU (armeabi) and unpopular CPU (mips).
  • Q: Which storage capacity do we have to consider to install all Gstreamer libraries on Android platform?

    • A: In case of ARM64, there are 122 static libraries (750MiB) in ./lib/ folder of prebuilt Gstreamer binary.
$ du -sh ./*
472M    ./arm
749M    ./arm64 (The arm64 folder is bigger than the others due to libavcodec.a.)
466M    ./armv7
328M    ./x86
546M    ./x86_64

$ cd arm64/lib/ ; ls -al ./lib/*.a -S
-rw-r--r-- 1 ubuntu ubuntu 170384372 Oct  6 00:37 ./lib/libavcodec.a
-rw-r--r-- 1 ubuntu ubuntu  51669238 Oct  6 00:37 ./lib/libavformat.a
-rw-rw-r-- 1 ubuntu ubuntu  25866618 Oct  6 11:16 ./lib/libvpx.a
-rw-r--r-- 1 ubuntu ubuntu  25405002 Oct  5 22:59 ./lib/libcrypto.a
-rw-r--r-- 1 ubuntu ubuntu  21552530 Oct  5 19:30 ./lib/libgio-2.0.a
-rw-r--r-- 1 ubuntu ubuntu  18967870 Oct  5 19:07 ./lib/libgnustl.a
-rw-r--r-- 1 ubuntu ubuntu  17960942 Oct  5 21:36 ./lib/libgnutls.a
-rw-r--r-- 1 ubuntu ubuntu  16142968 Oct  5 21:54 ./lib/libtag.a
-rw-r--r-- 1 ubuntu ubuntu  13161792 Oct  5 19:42 ./lib/libgstreamer-1.0.a
-rw-r--r-- 1 ubuntu ubuntu  12764148 Oct  5 21:14 ./lib/libhogweed.a
-rw-r--r-- 1 ubuntu ubuntu  12004860 Oct  5 19:47 ./lib/libxml2.a
-rw-r--r-- 1 ubuntu ubuntu  11985916 Oct  5 23:12 ./lib/libwebrtc_audio_processing.a
-rw-r--r-- 1 ubuntu ubuntu  11883410 Oct  5 20:08 ./lib/libcairo.a
-rw-r--r-- 1 ubuntu ubuntu  10043918 Oct  5 20:11 ./lib/libharfbuzz.a
-rw-r--r-- 1 ubuntu ubuntu   9803832 Oct  5 19:30 ./lib/libglib-2.0.a
-rw-r--r-- 1 ubuntu ubuntu   9450392 Oct  5 21:14 ./lib/libnettle.a
-rw-r--r-- 1 ubuntu ubuntu   9251962 Oct  5 22:34 ./lib/libopenh264.a
-rw-r--r-- 1 ubuntu ubuntu   7698100 Oct  5 23:53 ./lib/libx264.a
-rw-r--r-- 1 ubuntu ubuntu   7200908 Oct  5 19:57 ./lib/libfreetype.a
-rw-r--r-- 1 ubuntu ubuntu   6965966 Oct  6 00:49 ./lib/libges-1.0.a
-rw-r--r-- 1 ubuntu ubuntu   6728066 Oct  5 19:54 ./lib/libpixman-1.a
-rw-r--r-- 1 ubuntu ubuntu   6644574 Oct  5 21:41 ./lib/libsoup-2.4.a
-rw-r--r-- 1 ubuntu ubuntu   6435888 Oct  5 21:11 ./lib/libgmp.a
-rw-r--r-- 1 ubuntu ubuntu   5913020 Oct  5 20:53 ./lib/libgstvideo-1.0.a
-rw-r--r-- 1 ubuntu ubuntu   5363006 Oct  5 20:23 ./lib/liborc-0.4.a
-rw-r--r-- 1 ubuntu ubuntu   5307472 Oct  5 22:59 ./lib/libssl.a
-rw-r--r-- 1 ubuntu ubuntu   4847394 Oct  5 23:04 ./lib/libspandsp.a
-rw-r--r-- 1 ubuntu ubuntu   4425746 Oct  5 20:53 ./lib/libgstaudio-1.0.a
-rw-r--r-- 1 ubuntu ubuntu   4291116 Oct  5 19:42 ./lib/libgstbase-1.0.a
-rw-r--r-- 1 ubuntu ubuntu   4208630 Oct  5 22:49 ./lib/libopenjp2.a
-rw-r--r-- 1 ubuntu ubuntu   4197574 Oct  5 20:53 ./lib/libgstgl-1.0.a
-rw-r--r-- 1 ubuntu ubuntu   3924470 Oct  5 20:32 ./lib/libturbojpeg.a
-rw-r--r-- 1 ubuntu ubuntu   3748826 Oct  6 00:02 ./lib/libgstrtspserver-1.0.a
-rw-r--r-- 1 ubuntu ubuntu   3598076 Oct  5 20:26 ./lib/libopus.a
-rw-r--r-- 1 ubuntu ubuntu   3478452 Oct  5 20:32 ./lib/libjpeg.a
-rw-r--r-- 1 ubuntu ubuntu   3362240 Oct  6 00:37 ./lib/libavutil.a
-rw-r--r-- 1 ubuntu ubuntu   3315166 Oct  5 21:00 ./lib/libtiff.a
-rw-r--r-- 1 ubuntu ubuntu   3128890 Oct  5 19:30 ./lib/libgobject-2.0.a
-rw-r--r-- 1 ubuntu ubuntu   3123858 Oct  5 22:40 ./lib/libnice.a
-rw-r--r-- 1 ubuntu ubuntu   2984118 Oct  5 22:47 ./lib/librsvg-2.a
-rw-r--r-- 1 ubuntu ubuntu   2983962 Oct  5 20:21 ./lib/libvisual-0.4.a
-rw-r--r-- 1 ubuntu ubuntu   2825672 Oct  6 00:43 ./lib/libgstvalidate-1.0.a
-rw-r--r-- 1 ubuntu ubuntu   2599216 Oct  5 20:15 ./lib/libpango-1.0.a
-rw-r--r-- 1 ubuntu ubuntu   2598892 Oct  5 21:03 ./lib/libgdk_pixbuf-2.0.a
-rw-r--r-- 1 ubuntu ubuntu   2364684 Oct  5 22:45 ./lib/libcroco-0.6.a
-rw-r--r-- 1 ubuntu ubuntu   2286102 Oct  5 23:50 ./lib/libopencore-amrnb.a
-rw-r--r-- 1 ubuntu ubuntu   2274338 Oct  5 23:42 ./lib/libgstcodecparsers-1.0.a
-rw-r--r-- 1 ubuntu ubuntu   2103000 Oct  5 19:07 ./lib/libiconv.a
-rw-r--r-- 1 ubuntu ubuntu   2094352 Oct  5 20:00 ./lib/libfontconfig.a
-rw-r--r-- 1 ubuntu ubuntu   1981664 Oct  5 19:50 ./lib/libpng16.a
-rw-r--r-- 1 ubuntu ubuntu   1943462 Oct  5 20:53 ./lib/libgsttag-1.0.a
-rw-r--r-- 1 ubuntu ubuntu   1902336 Oct  5 21:46 ./lib/libmp3lame.a
-rw-r--r-- 1 ubuntu ubuntu   1825360 Oct  5 20:53 ./lib/libgstpbutils-1.0.a
-rw-r--r-- 1 ubuntu ubuntu   1755200 Oct  5 21:51 ./lib/libFLAC.a
-rw-r--r-- 1 ubuntu ubuntu   1739550 Oct  5 19:07 ./lib/libsupc++.a
-rw-r--r-- 1 ubuntu ubuntu   1720046 Oct  5 22:26 ./lib/libass.a
-rw-r--r-- 1 ubuntu ubuntu   1715848 Oct  5 21:44 ./lib/libmpg123.a
-rw-r--r-- 1 ubuntu ubuntu   1713782 Oct  5 22:28 ./lib/libfaad.a
-rw-r--r-- 1 ubuntu ubuntu   1712700 Oct  6 00:37 ./lib/libavfilter.a
-rw-r--r-- 1 ubuntu ubuntu   1550450 Oct  5 23:58 ./lib/libjson-glib-1.0.a
-rw-r--r-- 1 ubuntu ubuntu   1491728 Oct  5 20:18 ./lib/libtheora.a
-rw-r--r-- 1 ubuntu ubuntu   1291724 Oct  5 20:08 ./lib/libcairo-script-interpreter.a
-rw-r--r-- 1 ubuntu ubuntu   1230270 Oct  5 19:42 ./lib/libgstcheck-1.0.a
-rw-r--r-- 1 ubuntu ubuntu   1197692 Oct  5 21:48 ./lib/libwavpack.a
-rw-r--r-- 1 ubuntu ubuntu   1179164 Oct  5 20:18 ./lib/libtheoraenc.a
-rw-r--r-- 1 ubuntu ubuntu   1153408 Oct  5 20:28 ./lib/libgraphene-1.0.a
-rw-r--r-- 1 ubuntu ubuntu   1092172 Oct  5 22:43 ./lib/libvo-aacenc.a
-rw-r--r-- 1 ubuntu ubuntu   1090438 Oct  5 20:16 ./lib/libvorbisenc.a
-rw-r--r-- 1 ubuntu ubuntu   1083926 Oct  5 20:53 ./lib/libgstrtp-1.0.a
-rw-r--r-- 1 ubuntu ubuntu   1082830 Oct  5 20:16 ./lib/libvorbis.a
-rw-r--r-- 1 ubuntu ubuntu   1061970 Oct  5 23:42 ./lib/libgstmpegts-1.0.a
-rw-r--r-- 1 ubuntu ubuntu   1020114 Oct  5 19:55 ./lib/libexpat.a
-rw-r--r-- 1 ubuntu ubuntu   1011960 Oct  5 23:42 ./lib/libgstplayer-1.0.a
-rw-r--r-- 1 ubuntu ubuntu    950024 Oct  5 20:15 ./lib/libpangoft2-1.0.a
-rw-r--r-- 1 ubuntu ubuntu    929790 Oct  5 20:53 ./lib/libgstrtsp-1.0.a
-rw-r--r-- 1 ubuntu ubuntu    908916 Oct  5 22:30 ./lib/libkate.a
-rw-rw-r-- 1 ubuntu ubuntu    823938 Oct  5 22:34 ./lib/librtmp.a
-rw-r--r-- 1 ubuntu ubuntu    814008 Oct  5 20:53 ./lib/libgstsdp-1.0.a
-rw-r--r-- 1 ubuntu ubuntu    771352 Oct  5 22:00 ./lib/libdv.a
-rw-r--r-- 1 ubuntu ubuntu    754822 Oct  5 23:50 ./lib/libopencore-amrwb.a
-rw-r--r-- 1 ubuntu ubuntu    741266 Oct  5 19:42 ./lib/libgstnet-1.0.a
-rw-r--r-- 1 ubuntu ubuntu    736098 Oct  5 22:41 ./lib/libSoundTouch.a
-rw-r--r-- 1 ubuntu ubuntu    721910 Oct  5 20:57 ./lib/libspeex.a
-rw-rw-r-- 1 ubuntu ubuntu    695038 Oct  5 22:35 ./lib/libsrtp.a
-rw-r--r-- 1 ubuntu ubuntu    685290 Oct  5 20:33 ./lib/libvorbisidec.a
-rw-r--r-- 1 ubuntu ubuntu    677494 Oct  5 23:42 ./lib/libgstadaptivedemux-1.0.a
-rw-r--r-- 1 ubuntu ubuntu    675388 Oct  6 00:37 ./lib/libswresample.a
-rw-r--r-- 1 ubuntu ubuntu    650426 Oct  5 19:42 ./lib/libgstcontroller-1.0.a
-rw-r--r-- 1 ubuntu ubuntu    557632 Oct  5 20:18 ./lib/libtheoradec.a
-rw-r--r-- 1 ubuntu ubuntu    549410 Oct  5 19:13 ./lib/libz.a
-rw-r--r-- 1 ubuntu ubuntu    543884 Oct  5 20:53 ./lib/libgstapp-1.0.a
-rw-r--r-- 1 ubuntu ubuntu    509322 Oct  5 21:18 ./lib/libtasn1.a
-rw-r--r-- 1 ubuntu ubuntu    461760 Oct  5 20:15 ./lib/libpangocairo-1.0.a
-rw-r--r-- 1 ubuntu ubuntu    429568 Oct  5 23:51 ./lib/libmpeg2.a
-rw-r--r-- 1 ubuntu ubuntu    419054 Oct  5 20:53 ./lib/libgstriff-1.0.a
-rw-r--r-- 1 ubuntu ubuntu    395176 Oct  5 19:12 ./lib/libintl.a
-rw-r--r-- 1 ubuntu ubuntu    391332 Oct  5 22:25 ./lib/libfribidi.a
-rw-r--r-- 1 ubuntu ubuntu    382948 Oct  5 23:42 ./lib/libgstbadvideo-1.0.a
-rw-r--r-- 1 ubuntu ubuntu    374226 Oct  5 22:37 ./lib/libmms.a
-rw-r--r-- 1 ubuntu ubuntu    368366 Oct  5 20:53 ./lib/libgstfft-1.0.a
-rw-rw-r-- 1 ubuntu ubuntu    364442 Oct  5 19:55 ./lib/libbz2.a
-rw-r--r-- 1 ubuntu ubuntu    321046 Oct  5 23:42 ./lib/libgstbadaudio-1.0.a
-rw-r--r-- 1 ubuntu ubuntu    310920 Oct  5 23:42 ./lib/libgstwebrtc-1.0.a
-rw-r--r-- 1 ubuntu ubuntu    265088 Oct  5 22:36 ./lib/libdca.a
-rw-r--r-- 1 ubuntu ubuntu    258380 Oct  5 23:12 ./lib/libsbc.a
-rw-r--r-- 1 ubuntu ubuntu    217960 Oct  5 23:42 ./lib/libgstbasecamerabinsrc-1.0.a
-rw-r--r-- 1 ubuntu ubuntu    205084 Oct  5 20:16 ./lib/libvorbisfile.a
-rw-r--r-- 1 ubuntu ubuntu    197998 Oct  5 23:45 ./lib/liba52.a
-rw-r--r-- 1 ubuntu ubuntu    197406 Oct  5 23:42 ./lib/libgsturidownloader-1.0.a
-rw-r--r-- 1 ubuntu ubuntu    173812 Oct  5 20:23 ./lib/liborc-test-0.4.a
-rw-r--r-- 1 ubuntu ubuntu    170604 Oct  5 23:42 ./lib/libgstinsertbin-1.0.a
-rw-r--r-- 1 ubuntu ubuntu    167976 Oct  5 23:51 ./lib/libmpeg2convert.a
-rw-r--r-- 1 ubuntu ubuntu    163226 Oct  5 23:42 ./lib/libgstphotography-1.0.a
-rw-r--r-- 1 ubuntu ubuntu    145934 Oct  5 23:42 ./lib/libgstisoff-1.0.a
-rw-r--r-- 1 ubuntu ubuntu    142862 Oct  5 19:13 ./lib/libffi.a
-rw-r--r-- 1 ubuntu ubuntu    132154 Oct  5 19:48 ./lib/libogg.a
-rw-r--r-- 1 ubuntu ubuntu    114954 Oct  5 20:08 ./lib/libcairo-gobject.a
-rw-r--r-- 1 ubuntu ubuntu    111578 Oct  5 20:53 ./lib/libgstallocators-1.0.a
-rw-r--r-- 1 ubuntu ubuntu     68582 Oct  5 19:30 ./lib/libgmodule-2.0.a
-rw-r--r-- 1 ubuntu ubuntu     46734 Oct  5 22:30 ./lib/liboggkate.a
-rw-r--r-- 1 ubuntu ubuntu     27928 Oct  5 19:07 ./lib/libcharset.a
-rw-r--r-- 1 ubuntu ubuntu      8518 Oct  5 19:30 ./lib/libgthread-2.0.a
  • Q: what is the file size of 5 test applications that is released by Gstreamer community
    • A: Specified static libraries is selected by Android.mk. Then, ndk-build generates libgstreamer-android.so for a JNI-based Android Java application.
$ ls -al
-rw-rw-r-- 1 ubuntu ubuntu 10494336 12월 12 07:44 android-tutorial-1-debug.apk
-rw-rw-r-- 1 ubuntu ubuntu 22468768 12월 12 07:44 android-tutorial-2-debug.apk
-rw-rw-r-- 1 ubuntu ubuntu 27790487 12월 12 07:44 android-tutorial-3-debug.apk
-rw-rw-r-- 1 ubuntu ubuntu 58496669 12월 12 07:44 android-tutorial-4-debug.apk
-rw-rw-r-- 1 ubuntu ubuntu 58506609 12월 12 07:44 android-tutorial-5-debug.apk
$ mkdir android-tutorial-5-debug ; cd android-tutorial-5-debug
$ unzip ../android-tutorial-5-debug.apk
$ du -sh ./
8.0K    ./AndroidManifest.xml
80K     ./META-INF
636K    ./assets
1.6M    ./classes.dex
117M    ./lib
1.4M    ./res
184K    ./resources.arsc

$ find . -name *.so | xargs ls -alh
-rw-rw-r-- 1  ubuntu 1.1M Dec 31  1979 ./lib/arm64-v8a/libc++_shared.so
-rw-rw-r-- 1  ubuntu  31M Dec 31  1979 ./lib/arm64-v8a/libgstreamer_android.so <----  HERE!!!
-rw-rw-r-- 1  ubuntu  26K Dec 31  1979 ./lib/arm64-v8a/libtutorial-5.so
-rw-rw-r-- 1  ubuntu 642K Dec 31  1979 ./lib/armeabi-v7a/libc++_shared.so
-rw-rw-r-- 1  ubuntu  22M Dec 31  1979 ./lib/armeabi-v7a/libgstreamer_android.so <----  HERE!!!
-rw-rw-r-- 1  ubuntu  30K Dec 31  1979 ./lib/armeabi-v7a/libtutorial-5.so
-rw-rw-r-- 1  ubuntu 1.1M Dec 31  1979 ./lib/x86/libc++_shared.so
-rw-rw-r-- 1  ubuntu  31M Dec 31  1979 ./lib/x86/libgstreamer_android.so <----  HERE!!!
-rw-rw-r-- 1  ubuntu  30K Dec 31  1979 ./lib/x86/libtutorial-5.so
-rw-rw-r-- 1  ubuntu 1.1M Dec 31  1979 ./lib/x86_64/libc++_shared.so
-rw-rw-r-- 1  ubuntu  31M Dec 31  1979 ./lib/x86_64/libgstreamer_android.so <----  HERE!!!
-rw-rw-r-- 1  ubuntu  27K Dec 31  1979 ./lib/x86_64/libtutorial-5.so
$ readelf  -s ./libgstreamer_android.so  | wc -l
30760
Clone this wiki locally