金子邦彦研究室プログラミングJavaScript による Web プログラミングUbuntu で Android NDK を使い ARM+Android で動く C プログラムをコンパイルしてみる

Ubuntu で Android NDK を使い ARM+Android で動く C プログラムをコンパイルしてみる

前準備

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

  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
    

    [image]

    [image]

Ubuntu で Android NDK を使いCプログラムをコンパイルしてみる(コマンドライン)

  1. Android NDK のファイルの確認

    プラットフォーム

    cd /usr/local/android-ndk-r9b
    ls -la platforms
    

    [image]

    プラットフォーム下の 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
    
  2. 「Hello, World !」 を表示する C プログラムを hello.cのようなファイル名で保存
    #include 
    int main() {
      printf("Hello, World !\n");
      return 0;
    }
    
  3. コンパイル

    参考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
    
  4. ファイルの確認

    [image]
  5. Android SDK 付属のエミュレータで実行してみる

    次を実行

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

    [image]

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

    [image]

Ubuntu で Android NDK を使いCプログラムをコンパイルしてみる(コマンドライン)

以下、アプリケーションを置くディレクトリを /tmpであるとして説明する

  1. 「Hello, World !」 を表示する C プログラムを /tmp/jni/hello.cのようなファイル名で保存
    #include 
    int main() {
      printf("Hello, World !\n");
      return 0;
    }
    
  2. /tmp/jni/Android.mkを作成
    LOCAL_PATH := $(call my-dir)
    include $(CLEAR_VARS)
    LOCAL_MODULE    := a.out
    LOCAL_SRC_FILES := hello.c
    include $(BUILD_EXECUTABLE)
    
  3. ndk-build の実行
    cd /tmp
    ndk-build
    

    [image]
  4. ファイルの確認
    file /tmp/libs/armeabi/a.out 
    

    [image]
  5. Android SDK 付属のエミュレータで実行してみる

    次を実行

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

    [image]

    ログ(logcat のログ)として表示結果を残したい場合は次のように実行

    adb push /tmp/libs/armeabi/a.out /data/local
    adb shell
    cd /data/local
    logcat ./a.out