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

前準備

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

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

    → Ubuntu:Ubuntu での Android Studio についての Web ページ: ../../pro/js/as.html

  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
    

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

クロスコンパイラ(ターゲット: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
    

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;
    }
    

  2. コンパイル

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

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

  3. ファイルの確認

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

    次を実行

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

    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. ビルド結果の確認

  3. インストール操作

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

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

  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. ビルド結果の確認

  3. インストール操作

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

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

  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. ビルド結果の確認

  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
    

  2. ビルド結果の確認

    .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