Ubuntu で Android NDK を使い ARM+Android の開発環境を作る
前準備
前準備として,下記のインストールが済んでいること.
- JDK (Java Development Kit)のバージョン1.6.0_2以上と、Android SDK
→ Ubuntu:Ubuntu での Android Studio についての Web ページ: ../../pro/js/as.html
- (オプション) Eclipse, Eclipse の プラグイン Android Development Tools のインストール が終わっていること
- Android NDK のダウンロードとインストール
/usr/local/android-ndk-r9bにインストールされているものとして説明を続けます
- Android 2.2 を、次のような手順でインストールしておくこと
Android SDK マネージャ を起動し、Android 2.2 をインストールする。
◆ 起動手順の例
sudo /usr/local/android-studio/sdk/tools/android
Android NDK のファイルの確認
-
プラットフォーム
cd /usr/local/android-ndk-r9b ls -la platforms
- プラットフォーム下の sysroot
cd /usr/local/android-ndk-r9b ls platforms/android-4/arch-arm
- ツールチェーン
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 ../..- 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
- 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
- (オプション) 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 を作成
- Android の実機を接続する.あるいは android コマンドで、Android Virtual Device を起動する
- /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 !
- 「Hello, World !」 を表示する C プログラムを hello.cのようなファイル名で保存
#include<stdio.h> int main() { printf("Hello, World !\n"); return 0; }
- コンパイル
参考Webページ http://blog.kmckk.com/archives/2918551.html
$CC -march=armv5te -msoft-float -o a.out /tmp/hello.c
- ファイルの確認
- 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 のビルド
- ビルド
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
- ビルド結果の確認
- インストール操作
adb を用いて、ファイル転送を行う
sudo mkdir -p ${PREFIX} sudo chown ${USER} ${PREFIX} sudo make install
- 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
- ビルド
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
- ビルド結果の確認
- インストール操作
adb を用いて、ファイル転送を行う
sudo mkdir -p ${PREFIX} sudo chown ${USER} ${PREFIX} sudo make install
- Android への転送操作
ls ${PREFIX} adb push ${PREFIX} ${PREFIX} adb shell cd /system/lib ln -s /data/local/lib/libruby.so libruby.so
- 「Hello, World !」 を表示する C プログラムを hello.cのようなファイル名で保存
#include
int main() { printf("Hello, World !\n"); return 0; } - コンパイル
参考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
- ファイルの確認
- 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
- ビルド
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
- ビルド結果の確認
- インストール操作
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 用のツールチェーンのビルド手順
- ツールチェーンのビルド
「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
- ビルド結果の確認
.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