金子邦彦研究室研究道具箱と教材オープンデータとビッグデータ処理Ubuntu で Android NDK を使い ARM+Android の開発環境を作る

Ubuntu で Android NDK を使い ARM+Android の開発環境を作る

前準備

前準備として,下記のインストールが済んでいること.

  1. JDK (Java Development Kit)のバージョン1.6.0_2以上と、Android SDK

    → Ubuntu: Ubuntu での Android Studio についての Web ページ

  2. (オプション) Eclipse, Eclipse の プラグイン Android Development Tools のインストール が終わっていること

  3. Android NDK のダウンロードとインストール

    /usr/local/android-ndk-r9bにインストールされているものとして説明を続けます

  4. Android 2.2 を、次のような手順でインストールしておくこと

    Android SDK マネージャ を起動し、Android 2.2 をインストールする。

    ◆ 起動手順の例

    sudo /usr/local/android-studio/sdk/tools/android
    

Android NDK のファイルの確認

  1. プラットフォーム
    cd /usr/local/android-ndk-r9b
    ls -la platforms
    

  2. プラットフォーム下の sysroot
    cd /usr/local/android-ndk-r9b
    ls platforms/android-4/arch-arm
    

    [image]

  3. ツールチェーン
    ls /usr/local/android-ndk-r9b/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64
    

    [image]

クロスコンパイラ(ターゲット:arm-linux-androideabi)

https://developer.android.com/tools/sdk/ndk/index.html make-standalone-toolchain.sh --toolchain=arm-linux-androideabi-4.8 cmake -DCMAKE_TOOLCHAIN_FILE=arm-eabi-gcc.cmake ../.. android-cmake -DCMAKE_TOOLCHAIN_FILE=arm-eabi-gcc.cmake ../..
  1. arm-linux-androideabi をターゲットとする binutils をビルドしインストールする

    --with-sysroot=/usr/local/android-ndk-r9b/platforms/android-4 を設定する

    cd /tmp
    apt-get source binutils
    sudo apt-get -yV build-dep binutils
    #
    cd /tmp
    if [ ! -f binutils-2.24.tar.gz ]; then 
        wget http://ftp.gnu.org/gnu/binutils/binutils-2.24.tar.gz
    fi
    sudo rm -rf binutils-2.24
    tar -xvzof binutils-2.24.tar.gz
    sudo chown -R $USER binutils-2.24
    #
    cd /tmp
    cd binutils-2.24
    rm -rf arm-linux-androideabi
    mkdir arm-linux-androideabi
    cd arm-linux-androideabi
    CC=gcc-4.8 \
    CXX=g++-4.8 \
    ../configure --host=`arch`-pc-linux-gnu  --with-cross-host=`arch`-pc-linux-gnu --target=arm-linux-androideabi \
        --build=`arch`-pc-linux-gnu \
        --enable-gnu-as --enable-gnu-ld --enable-multilib --enable-generated-files-in-srcdir --enable-version-specific-runtime-libs \
            --disable-werror --enable-libtool --disable-nls --disable-shared \
        --disable-threads --disable-clocale \
        --with-sysroot=/usr/local/android-ndk-r9b/platforms/android-4 
    make -j8 
    sudo make install
    sudo ldconfig
    make check
    

  2. arm-linux-androideabi をターゲットとする gcc-4.8 をビルドしインストールする

    関連する外部ページhttps://gcc.gnu.org/install/build.html

    --enable-languages=c,fortran, --with-sysroot=/usr/local/android-ndk-r9b/platforms/android-4 を設定する

    cd /tmp
    apt-get source gcc-4.6
    sudo apt-get -yV build-dep gcc-4.6
    #
    cd /tmp
    if [ ! -f gcc-4.8.2.tar.gz ]; then 
        wget http://www.ring.gr.jp/archives/lang/egcs/releases/gcc-4.8.2/gcc-4.8.2.tar.gz
    fi
    sudo rm -rf gcc-4.8.2
    tar -xvzof gcc-4.8.2.tar.gz
    sudo chown -R $USER gcc-4.8.2
    #
    cd /tmp
    cd gcc-4.8.2
    rm -rf arm-linux-androideabi
    mkdir arm-linux-androideabi
    cd arm-linux-androideabi
    CC=gcc-4.8 \
    CXX=g++-4.8 CXXFLAGS="-I/usr/local/include/c++/4.8.2 -I/usr/local/include/c++/4.8.2/`arch`-pc-linux-gnu" \
    ../configure --host=`arch`-pc-linux-gnu  --with-cross-host=`arch`-pc-linux-gnu --target=arm-linux-androideabi \
        --enable-languages=c,fortran --disable-lto \
        --build=`arch`-pc-linux-gnu \
        --enable-gnu-as --enable-gnu-ld --enable-multilib --enable-generated-files-in-srcdir --enable-version-specific-runtime-libs \
        --disable-werror --enable-libtool --disable-nls --disable-shared \
        --disable-threads --disable-clocale \
        --enable-interwork \
        --enable-multiarch \
        --with-arch=armv7-a --with-float=soft --with-float-abi=softfp --with-fpu=vfp \
        --without-newlib --without-headers \
        --disable-libstdcxx --disable-hosted-libstdcxx --disable-libstdcxx-threads \
        --disable-werror \
        --disable-checking \
        --disable-ppl-version-check --disable-cloog-version-check \
        --disable-libssp --disable-libmudflap --disable-libgomp --disable-sjlj-exceptions --disable-tls --disable-libitm --disable-libatomic \
        --disable-bootstrap \
        --with-sysroot=/usr/local/android-ndk-r9b/platforms/android-4/arch-arm 
    make -j8
    sudo make install
    sudo ldconfig
    make check
    

  3. (オプション) arm-linux-androideabi をターゲットとする glibc をビルドしインストールする

    --with-sysroot=/usr/local/android-ndk-r9b/platforms/android-4 を設定する

    cd /tmp
    apt-get source libglib2.0-dev
    sudo apt-get -yV build-dep libglib2.0-dev
    #
    cd /tmp
    if [ ! -f glibc-2.18.tar.gz ]; then 
      wget http://ftp.gnu.org/gnu/glibc/glibc-2.18.tar.gz
    fi
    tar -xvzof glibc-2.18.tar.gz
    sudo chown -R $USER glibc-2.18
    #
    cd /tmp
    cd glibc-2.18
    rm -rf arm-linux-androideabi
    mkdir arm-linux-androideabi
    cd arm-linux-androideabi
    CC=gcc-4.8 \
    CXX=g++-4.8 \
    ../configure --host=`arch`-pc-linux-gnu  --with-cross-host=`arch`-pc-linux-gnu --target=arm-linux-androideabi \
        --build=`arch`-pc-linux-gnu \
        --enable-gnu-as --enable-gnu-ld --enable-multilib --enable-generated-files-in-srcdir --enable-version-specific-runtime-libs \
        --disable-werror --enable-libtool --disable-nls --disable-shared \
        --disable-threads --disable-clocale \
        --disable-static-nss --disable-nss-crypt --without-selinux --disable-nscd\
        --prefix=/usr/local/arm-linux-androideabi-glibc-2.18 \
        --with-sysroot=/usr/local/android-ndk-r9b/platforms/android-4/arch-arm 
    make -j8
    sudo make install
    sudo ldconfig
    make check
    

Android マシンで新しいディレクトリ /data/local を作成

  1. Android の実機を接続する.あるいは android コマンドで、Android Virtual Device を起動する

  2. /system を書き込み可能, /data/local を作成する操作
    adb shell mount -o remount,rw /system
    adb shell mount -o remount,rw /data
    adb shell mkdir /data/local 
    

    [image]

Android マシンで動く各種ツールのビルド

前準備

export NDKROOT=/usr/local/android-ndk-r9b
export SYSROOT=${NDKROOT}/platforms/android-4/arch-arm
export PREFIX=/data/local 
export CC="/usr/local/bin/arm-linux-androideabi-gcc  -mandroid --sysroot=${SYSROOT}"
export CXX="/usr/local/bin/arm-linux-androideabi-g++  -mandroid --sysroot=${SYSROOT}"
export LD="/usr/local/bin/arm-linux-androideabi-ld  -mandroid --sysroot=${SYSROOT}"
export CFLAGS="-march=-march=armv7-a -mfloat-abi=softfp -I${SYSROOT}/include -I/usr/local/include" 
export CXXFLAGS="-march=-march=armv7-a -mfloat-abi=softfp -I${SYSROOT}/include -I/usr/local/include -I${NDKROOT}/sources/cxx-stl/system/include" 
export LDFLAGS="-Wl,--fix-cortex-a8 -L${SYSROOT}/lib -L/usr/local/lib -L${PREFIX}/lib"
export LIBS="-lpthread"

Hello, World !

  1. 「Hello, World !」 を表示する C プログラムを hello.cのようなファイル名で保存
    #include<stdio.h>
    int main() {
      printf("Hello, World !\n");
      return 0;
    }
    

    [image]

  2. コンパイル

    参考Webページ http://blog.kmckk.com/archives/2918551.html

    $CC -march=armv5te -msoft-float -o a.out /tmp/hello.c 
    

    [image]

  3. ファイルの確認

    [image]

  4. Android SDK 付属のエミュレータで実行してみる

    次を実行

    adb push a.out /data/local 
    adb shell
    cd /data/local
    ./a.out
    

    [image]

    not executable: magic 7F45」のようなエラーメッセージが出る場合. Genymotion は ARM ではなく x86 ベースのエミュレータなので注意. Genymotion ではなく Android SDK 付属のエミュレータを使う.(android コマンドで簡単に起動できる)

書きかけ

rm -rf /home/ubuntuuser/.android/avd/hoge4* 
android list targets
android create avd --name hoge4 --target 9 --sdcard 2047M 
echo 'sdcard.size=2047M' >> /home/ubuntuuser/.android/avd/hoge4.ini
echo 'disk.dataPartition.size=2047' >> /home/ubuntuuser/.android/avd/hoge4.ini
echo 'disk.systemPartition.size=2047' >> /home/ubuntuuser/.android/avd/hoge4.ini

adb kill-server
rm -f /home/ubuntuuser/.android/avd/*/*.lock 
adb start-server

emulator -avd hoge4 -partition-size 2047 -data /home/ubuntuuser/.android/avd/hoge4.avd/userdata.img -sdcard /home/ubuntuuser/.android/avd/hoge4.avd/sdcard.img 

adb root
adb shell cat /proc/partitions
adb shell mount
adb shell df
adb shell mount -rw -o remount /dev/block/mtdblock0 /system
adb shell mkdir /data/local 

ls /system/local
adb push /system/local /system/local
adb shell
cd /system/lib
ln -s /data/local/lib/libruby.so libruby.so

Android 用 bash のビルド

  1. ビルド
    cd /tmp
    if [ ! -f bash-4.2.tar.gz ]; then 
      wget http://mirror.csclub.uwaterloo.ca/gnu/bash/bash-4.2.tar.gz
    fi
    tar xvzf bash-4.2.tar.gz
    rm -rf bash-4.2
    tar -xvzof bash-4.2.tar.gz
    sudo chown -R $USER bash-4.2
    # 
    wget http://www.compdigitec.com/labs/files/bash-android.patch
    patch -p0 < bash-android.patch
    ./configure --host=arm-linux --enable-static-link --without-bash-malloc --disable-rpath --disable-nls --prefix=${PREFIX}
    make
    
    cd bash-4.2
    ./configure --host=arm-linux --build=`arch`-pc-linux-gnu --prefix=${PREFIX} --with-gnu-ld 
    make
    
    --disable-coprocesses --disable-job-control --disable-process-substitution

  2. ビルド結果の確認

    [image]

  3. インストール操作

    adb を用いて、ファイル転送を行う

    sudo mkdir -p ${PREFIX}
    sudo chown ${USER} ${PREFIX}
    sudo make install
    

    [image]

  4. Android への転送操作
    ls ${PREFIX}
    adb push ${PREFIX} ${PREFIX}
    adb shell
    cd /system/lib
    ln -s /data/local/lib/libruby.so libruby.so
    

    Android 用 Ruby のビルド

    参考Webページ http://blog.kmckk.com/archives/2918745.html

    1. ビルド
      cd /tmp
      rm -f ruby-1.9.3-p484.tar.gz
      wget https://www.kkaneko.jp/rinkou/js/ruby-1.9.3-p484.tar.gz
      rm -rf ruby-1.9.3-p484
      tar -xvzof ruby-1.9.3-p484.tar.gz
      cd ruby-1.9.3-p484
      sudo ./configure --host=arm-linux-eabi --build=`arch`-pc-linux-gnu --prefix=${PREFIX} --disable-shared
      make
      

    2. ビルド結果の確認

      [image]

    3. インストール操作

      adb を用いて、ファイル転送を行う

      sudo mkdir -p ${PREFIX}
      sudo chown ${USER} ${PREFIX}
      sudo make install
      

      [image]

    4. Android への転送操作
      ls ${PREFIX}
      adb push ${PREFIX} ${PREFIX}
      adb shell
      cd /system/lib
      ln -s /data/local/lib/libruby.so libruby.so
      




      1. 「Hello, World !」 を表示する C プログラムを hello.cのようなファイル名で保存
        #include 
        int main() {
          printf("Hello, World !\n");
          return 0;
        }
        

      2. コンパイル

        参考Webページ http://blog.kmckk.com/archives/2918551.html

        cd /tmp
        export PATH=/usr/local/android-ndk-r9b/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin:$PATH
        /usr/local/android-ndk-r9b/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/arm-linux-androideabi-gcc  -mandroid --sysroot=/usr/local/android-ndk-r9b/platforms/android-4/arch-arm -march=armv5te -msoft-float -o a.out hello.c 
        

      3. ファイルの確認

      4. Android SDK 付属のエミュレータで実行してみる

        次を実行

        adb push /tmp/a.out /data/local 
        adb shell
        cd /data/local
        ./a.out
        

        not executable: magic 7F45」のようなエラーメッセージが出る場合. Genymotion は ARM ではなく x86 ベースのエミュレータなので注意. Genymotion ではなく Android SDK 付属のエミュレータを使う.(android コマンドで簡単に起動できる)

      Android マシンで動く各種ツールのビルド

      前準備

      export NDKROOT=/usr/local/android-ndk-r9b
      export SYSROOT=${NDKROOT}/platforms/android-4/arch-arm
      export MY_TOOLCHAIN_DIR=${NDKROOT}/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64
      export PATH=${MY_TOOLCHAIN_DIR}/bin:$PATH
      export PREFIX=/data/local 
      export CC="${MY_TOOLCHAIN_DIR}/bin/arm-linux-androideabi-gcc  -mandroid --sysroot=${SYSROOT}"
      export CXX="${MY_TOOLCHAIN_DIR}/bin/arm-linux-androideabi-g++  -mandroid --sysroot=${SYSROOT}"
      export LD="${MY_TOOLCHAIN_DIR}/bin/arm-linux-androideabi-ld  -mandroid --sysroot=${SYSROOT}"
      # export AR="${MY_TOOLCHAIN_DIR}/bin/arm-linux-androideabi-ar  -mandroid --sysroot=${SYSROOT}"
      # export CPP="${MY_TOOLCHAIN_DIR}/bin/arm-linux-androideabi-cpp  -mandroid --sysroot=${SYSROOT}"
      export CFLAGS="-march=-march=armv7-a -mfloat-abi=softfp -I${SYSROOT}/include -I${MY_TOOLCHAIN_DIR}/include" 
      export CXXFLAGS="-march=-march=armv7-a -mfloat-abi=softfp -I${SYSROOT}/include -I${MY_TOOLCHAIN_DIR}/include -I${NDKROOT}/sources/cxx-stl/system/include" 
      export LDFLAGS="-Wl,--fix-cortex-a8 -L${SYSROOT}/lib -L${MY_TOOLCHAIN_DIR}/lib -L${PREFIX}/lib"
      export LIBS="-lpthread"
      

      Android 用 Ruby のビルド

      参考Webページ http://blog.kmckk.com/archives/2918745.html

      1. ビルド
        cd /tmp
        rm -f ruby-1.9.3-p484.tar.gz
        wget https://www.kkaneko.jp/rinkou/js/ruby-1.9.3-p484.tar.gz
        rm -rf ruby-1.9.3-p484
        tar -xvzof ruby-1.9.3-p484.tar.gz
        cd ruby-1.9.3-p484
        sudo ./configure --host=arm-eabi --prefix=${PREFIX} --enable-shared
        make
        

      2. ビルド結果の確認

        [image]

      3. インストール操作

        adb を用いて、ファイル転送を行う

        sudo mkdir -p ${PREFIX}
        sudo chown ${USER} ${PREFIX}
        sudo make install
        ls ${PREFIX}
        adb push ${PREFIX}/bin ${PREFIX}/bin
        adb push ${PREFIX}/lib ${PREFIX}/lib
        adb push ${PREFIX}/include ${PREFIX}/include
        adb push ${PREFIX}/share ${PREFIX}/share
        adb
        cd /system/lib
        ln -s /data/local/lib/libruby.so libruby.so
        


        ここから下は書きかけ

        android-14 用のツールチェーンのビルド手順

        1. ツールチェーンのビルド

          「android-14」のところは適切に設定

          sudo mkdir /data/local
          sudo chown -R $USER /data/local
          ${NDKROOT}/build/tools/make-standalone-toolchain.sh --platform=android-14 --install-dir=/data/local
          

          [image]

        2. ビルド結果の確認

          [image]

          .bashrc で SYSROOT と PATH の設定

          cd 
          echo "export ANDROID_TOOLCHAIN=/data/local" >> .bashrc
          echo "export SYSROOT=\${NDKROOT}/platforms/android-3/arch-arm" >> .bashrc
          echo "export PATH=\$ANDROID_TOOLCHAIN/bin:\$PATH" >> .bashrc
          

          参考Webページ https://d.hatena.ne.jp/yukoba/20121012/p1

          export ANDROID_TOOLCHAIN=/data/local
          export SYSROOT=${NDKROOT}/platforms/android-3/arch-arm
          export PATH=$ANDROID_TOOLCHAIN/bin:$PATH
          export AR=$BUILD_HOST-ar
          export AS=$BUILD_HOST-as
          export CPP=$BUILD_HOST-cpp
          export LD=$BUILD_HOST-ld
          export LIBTOOL=$ANDROID_TOOLCHAIN/bin/libtool
          export CC=$ANDROID_TOOLCHAIN/bin/$BUILD_HOST-gcc
          export CXX=$BUILD_HOST-g++
          export F77=$BUILD_HOST-gfortran
          export CFLAGS="-mthumb -march=armv7-a -mfloat-abi=softfp -I$ANDROID_TOOLCHAIN/include -UHAVE_LOCALE_H -UHAVE_PWD_H"
          export CXXFLAGS="-mthumb -march=armv7-a -mfloat-abi=softfp -I$ANDROID_TOOLCHAIN/include -UHAVE_LOCALE_H -UHAVE_PWD_H"
          export F77FLAGS="-mthumb -march=armv7-a -mfloat-abi=softfp -I$ANDROID_TOOLCHAIN/include -UHAVE_LOCALE_H -UHAVE_PWD_H"
          export LDFLAGS="-Wl,--fix-cortex-a8 -L$ANDROID_TOOLCHAIN/lib"
          
          
          # autoconf
          cd /tmp
          apt-get source autoconf
          sudo rm -rf autoconf-2.68
          tar -xvzof autoconf_2.68.orig.tar.gz
          cd autoconf-2.68
          ./configure --host=arm-linux-androideabi --prefix=$ANDROID_TOOLCHAIN --enable-shared
          make -j 4
          make install
          
          # see lib/relocatable.c
          #  https://www.opensource.apple.com/source/cvs/cvs-29/cvs/lib/getline.c
          のgetline.c をマージする
          # libiconv
          rm -rf libiconv-1.9.1
          wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.9.1.tar.gz
          tar -xvzof libiconv-1.9.1.tar.gz
          cd libiconv-1.9.1
          ./configure --host=arm-linux-gnueabi --prefix=$ANDROID_TOOLCHAIN --enable-shared
          make -j 4
          make install
          
          gettext の
          nl_langinfo.c については次のように書き換え
          
                //    case RADIXCHAR:
                //      return localeconv () ->decimal_point;
                //    case THOUSEP:
                //      return localeconv () ->thousands_sep;
          
          # gettext
          cd /tmp
          apt-get source gettext
          sudo rm -rf gettext-0.18.1.1
          tar -xvzof gettext_0.18.1.1.orig.tar.gz
          cd gettext-0.18.1.1
          ./configure --host=arm-linux-gnueabi --prefix=$ANDROID_TOOLCHAIN --enable-shared
          make -j 4
          make install
          
          # libglib
          cd /tmp
          apt-get source libglib
          sudo rm -rf glib-2.32.4
          xz -d glib2.0_2.32.4.orig.tar.xz 
          tar -xvf glib2.0_2.32.4.orig.tar
          cd glib-2.32.4
          ./configure --host=arm-linux-gnueabi --prefix=$ANDROID_TOOLCHAIN --with-gnu-ld --disable-selinux --disable-fam --disable-xattr --enable-shared
          make -j 4ssssss
          make install
          
          # pkg-config
          cd /tmp
          apt-get source pkg-config
          sudo rm -rf pkg-config-0.26
          tar -xvzof pkg-config_0.26.orig.tar.gz
          cd pkg-config-0.26
          ./configure --host=arm-linux-gnueabi --prefix=$ANDROID_TOOLCHAIN --enable-shared
          make -j 4
          make install
          
          
          
          # libtool
          cd /tmp
          apt-get source libtool
          sudo rm -rf libtool-2.4.2
          tar -xvzof libtool_2.4.2.orig.tar.gz
          cd libtool-2.4.2
          ./configure --host=arm-linux-androideabi --prefix=$ANDROID_TOOLCHAIN --enable-shared 
          make -j 4
          make install
          
           GMP 4.2+, MPFR 2.3.1+ and MPC 0.8.0+.
          # gmp
          cd /tmp
          apt-get source gmp
          sudo rm -rf gmp-5.0.2+dfsg
          tar -xvzof gmp_5.0.2+dfsg.orig.tar.gz
          cd gmp-5.0.2+dfsg
          ./configure --host=arm-linux-androideabi --prefix=$ANDROID_TOOLCHAIN --enable-shared
          make -j 4
          make install
          
          # mpfr
          cd /tmp
          apt-get source libmpfr-dev
          sudo rm -rf mpfr-3.1.0
          tar -xvjof mpfr4_3.1.0.orig.tar.bz2
          cd mpfr-3.1.0
          ./configure --host=arm-linux-androideabi --prefix=$ANDROID_TOOLCHAIN --enable-shared
          make -j 4
          make install
          
          # libmpdclient-dev 
          cd /tmp
          apt-get source libmpdclient
          sudo rm -rf libmpdclient-2.3
          tar -xvzof libmpdclient_2.3.orig.tar.gz
          cd libmpdclient-2.3
          ./configure --host=arm-linux-gnueabi --prefix=$ANDROID_TOOLCHAIN --enable-shared
          make -j 4
          make install
          
          
          # mpc
          cd /tmp
          apt-get source mpc
          sudo rm -rf mpc-0.20
          tar -xvzof mpc_0.20.orig.tar.gz
          cd mpc-0.20
          ./configure --host=arm-linux-androideabi --prefix=$ANDROID_TOOLCHAIN --enable-shared
          make -j 4
          make install
          
          
          # R
          cd /tmp
          apt-get source r-base
          sudo rm -rf R-3.0.2
          tar -xvzof r-base_3.0.2.orig.tar.gz
          cd R-3.0.2
          ./configure --host=arm-linux-androideabi --prefix=$ANDROID_TOOLCHAIN --with-readline=no --enable-shared
          make -j 4
          make install
          

        参考Webページ http://absolutearea.blogspot.jp/2012/07/android.html


        本サイトのサイトマップは,サイトマップのページをご覧下さい. 本サイト内の検索は,サイト内検索のページをご利用下さい.

        問い合わせ先: 金子邦彦(かねこ くにひこ) [image]