金子邦彦研究室プログラミングJavaScript による Web プログラミングUbuntu で Android NDK を使ってみる

Ubuntu で Android NDK を使ってみる

このページでは,次のことを行う.

Java Platform (JDK) のインストール

 

前準備として,Java Platform (JDK) のインストールが済んでいること.

  1. Java Platform (JDK) のインストール

    ◆ Ubuntu 12.04 での実行手順例

    sudo add-apt-repository -y ppa:webupd8team/java
    sudo apt -y update
    sudo apt -y install oracle-java8-installer
    sudo apt -y install oracle-java8-set-default 
    java -version
    

    [image]
  2. Oracle (SUN) JDK を使うように設定
    sudo update-java-alternatives  --jre -s java-8-oracle
    sudo update-java-alternatives  --jre-headless -s java-8-oracle
    sudo update-java-alternatives  -s java-8-oracle
    
  3. 設定の確認

    次のコマンドを実行.し、/usr/lib/jvm/java-8-oracle...の行に設定されていることを確認する

    sudo update-alternatives --config java 
    

    [image]
  4. java のバージョンの確認

    update-java-alternatives -l 
    java -version 
    

    [image]
  5. 変数 JAVA_HOME の設定

    ~/.bashrc または ~/.bash_profile に次のように設定(設定例

    export JAVA_HOME=/usr/lib/jvm/java-8-oracle
    export PATH=/usr/lib/jvm/java-8-oracle/bin:$PATH
    export CLASSPATH=.:/usr/lib/jvm/java-8-oracle/lib
    
 

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

  1. (オプション) Eclipse, Eclipse の プラグイン Android Development Tools のインストール が終わっていること
  2. (オプション) Eclipse に C/C++ 開発ツール (CDT) のインストール が終わっていること

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

  1. Web ページを開く

    https://developer.android.com/sdk/ndk/index.html

  2. Linux 版を選ぶ

    クリックするとダウンロードが始まる。

    [image]
  3. ライセンス条項の確認

    熟読し、納得できる場合にのみ続行する.

    [image]
  4. 分かりやすいディレクトリで、ダウンロードしたファイルを展開(解凍)

    ダウンロードしたファイルは,分かりやすいところに解凍 (ここでは,/usr/localと書いています).

    ■ 32 ビット Linux では 「x86

    cd /usr/local
    sudo tar -xvjof /tmp/android-ndk32-r10b-linux-x86.tar.bz2
    

    [image]

    ■ 64 ビット Linux では 「x86_64

    cd /usr/local
    sudo tar -xvjof /tmp/android-ndk32-r10b-linux-x86_64.tar.bz2
    

    [image]
  5. 所有権の設定

    sudo chown -R $USER:$USER /usr/local/android-ndk-r10b
    

    [image]
  6. 変数 PATH, NDKROOT の設定

    ndk-build コマンドなどにパスを通す操作.

    cd 
    echo 'export PATH=$PATH:/usr/local/android-ndk-r10b' >> .bashrc 
    echo 'export NDKROOT=/usr/local/android-ndk-r10b' >> .bashrc 
    

    [image]

Android NDK に同封のサンプルプログラムのコンパイル

  1. cd /usr/local/android-ndk-r10b/samples/hello-jni

    cd /usr/local/android-ndk-r10b/samples/hello-jni
    

    [image]
  2. ndk-build コマンドの実行

    ndk-build 
    

    ◆ 実行結果の例

    [image]
  3. 「.so」ファイルができる.

    ls -al obj/local/armeabi
    

    [image]

    書きかけ  Android ツールチェーン (toolchain) のビルド

    「Android ツールチェーン (toolchain) のビルド」の説明は書きかけです

    ■ 例1

    export SYSROOT=/usr/local/android-ndk-r10b/platforms/android-19/arch-x86
    /usr/local/android-ndk-r10b/build/tools/make-standalone-toolchain.sh --verbose --toolchain=x86-4.8 --install-dir=/usr/local/android-ndk-r10b/prebuilt/linux-x86_64 --ndk-dir=/usr/local/android-ndk-r10b --platform=android-19
    ls -al /usr/local/android-ndk-r10b/prebuilt/linux-x86_64/lib
    

    [image]

    ■ 例2

    export SYSROOT=/usr/local/android-ndk-r10b/platforms/android-17/arch-x86
    /usr/local/android-ndk-r10b/build/tools/make-standalone-toolchain.sh --verbose --toolchain=x86-4.8 --install-dir=/usr/local/android-ndk-r10b/prebuilt/linux-x86_64 --ndk-dir=/usr/local/android-ndk-r10b --platform=android-17
    ls -al /usr/local/android-ndk-r10b/prebuilt/linux-x86_64/lib
    

    [image]

    ■ 例3

    export SYSROOT=/usr/local/android-ndk-r10b/platforms/android-19/arch-arm
    /usr/local/android-ndk-r10b/build/tools/make-standalone-toolchain.sh --verbose --toolchain=arm-linux-androideabi-4.8 --install-dir=/usr/local/android-ndk-r10b/prebuilt/linux-x86_64 --ndk-dir=/usr/local/android-ndk-r10b --platform=android-19
    ls -al /usr/local/android-ndk-r10b/prebuilt/linux-x86_64/lib
    

    [image]

    ■ 例4

    export SYSROOT=/usr/local/android-ndk-r10b/platforms/android-17/arch-arm
    /usr/local/android-ndk-r10b/build/tools/make-standalone-toolchain.sh --verbose --toolchain=arm-linux-androideabi-4.8 --install-dir=/usr/local/android-ndk-r10b/prebuilt/linux-x86_64 --ndk-dir=/usr/local/android-ndk-r10b --platform=android-17
    ls -al /usr/local/android-ndk-r10b/prebuilt/linux-x86_64/lib
    

    [image]

    Eclipse の設定

    Eclipse で Android NDK に同封のサンプルプログラムを動かしてみる

    ここでは,インストールがうまくできたことの確認のため, さきほど、ビルドを済ませた hello-jni(Android NDK に同封のサンプルプログラム) のファイルをまるごと Eclipse のワークスペースに取り込んで実行する.

    1. Eclipse の起動
    2. ファイル (File)」 → 「新規 (New)」 → 「プロジェクト (Project)」 と操作する

      [image]
    3. 既存コードからの Android プロジェクト (Android Project from Existing Code) を選ぶ

      [image]
    4. プロジェクトのインポートに関する設定を行う.

      ルート・ディレクトリー」として「/usr/local/android-ndk-r10b/samples/hello-jni」を指定する.

      「プロジェクトをワークスペースにコピー (Copy projects into workspace)」にチェックし、「Finish」をクリックする

      ※ hello-jni は、先ほどコマンドプロンプトで ndk-build を実行して、ビルド済み

      [image]
    5. 実行してみる (エミュレータにデプロイ)

      プロジェクトを右クリックし, 「実行 (Run)」 → 「Android Application

      [image]

      しばらく待つと, エミュレータの画面に「Hello from JNI!」というメッセージが現れる.

      [image]

      コンソールに、エラーメッセージが出ていないことを確認する

      [image]

    JNI プログラムの ビルドが Eclipse で行えるようにするための設定

    Windows のコマンドプロンプトを開いて ndk-build コマンドを実行するのが面倒(Eclipse ndk-build コマンドの起動が行えるように設定したい)ので、次のように操作する.

    1. 先ほど使ったプロジェクト HelloJni を右クリックし,「Android ツール」を選び、 「ネイティブサポートの追加 (Add Native Support)」

      [image]
    2. libhello-jni.so に設定

      [image]
    3. プロジェクトを右クリックし、 「プロジェクトをクリーン」、「プロジェクトをビルド」と操作

      [image]

      [image]
    4. コンソールに ndk-build の実行結果が出るので確認する

      [image]

      ※ コンソールにエラーメッセージが無いのに、エラーメッセージが出る場合がある.

      もともとサンプルプログラムを使っているので、エラーメッセージが出るはずが無い. なのに、エラーメッセージが出る.どうやら Eclipse の設定が甘い(が、どうしたらよいか分からない). エラーメッセージが出たせいで、実行ができないという Eclipse のおせっかい機能.

      このときは Eclipse を再起動するとうまくいく場合がある.

    5. 実行してみる (エミュレータにデプロイ)

      プロジェクトを右クリックし, 「実行 (Run)」 → 「Android Application

      しばらく待つと, エミュレータの画面に「Hello from JNI!」というメッセージが現れる.

      コンソールに、エラーメッセージが出ていないことを確認する


    C プログラムの編集、ビルドが Eclipse で行えるようにするための設定

    Eclipse 上で ndk-build の操作ができるようにしたいので, 「Convert to a C/C++ Porject (Adds C/C++ Nature)」を実行する.

    1. まず,「ファイル (File)」 → 「新規 (New)」 → 「その他 (Other)」
    2. C/C++C/C++ プロジェクトへ変換 (C/C++ ネーチャー追加) (Convert to a C/C++ Porject (Adds C/C++ Nature))と操作する

      [image]
    3. Makefile プロジェクト (Makefile project) を選び,「他のツールチェーン (Other Toolchain)」を選ぶ.Finish をクリック

      これは、操作を間違えると、やり直すのがとても面倒なので、注意深く行う

      [image]
    4. パースペクティブに関する確認

      [image]
    5. プロパティーの設定

      プロジェクトを右クリックし,「プロパティー」を選ぶ.設定用のウインドウが現れる.

      [image]
    6. C/C++ ビルド (C/C++ Build)」の「ビルダー設定 (Builder Settings)」タブ の ビルドコマンドを 「${NDKROOT}/ndk-build」のように設定

      [image]

      ◆ ビルドコマンドの設定例

      • Linux, MacOS の場合: 「${NDKROOT}/ndk-build
      • Windows の場合: 「${NDKROOT}/ndk-build.cmd

      ◆ 環境変数 NDKROOT は、別のところで設定しておくこと. 例えば .bashrc に「 export NDKROOT=/usr/local/android-ndk-r10b 」のように設定するなど.

      ◆ 環境変数 NDKROOTの設定を忘れると、Eclipse のコンソールに次のようなエラーメッセージが出る

      [image]
    7. 振る舞い (Behaviour)」は、リソース保管時のインストール(自動ビルド)をチェックする

      [image]
    8. 今度は、「C/C++ 一般 (C/C++ General)」の「パスおよびシンボル (Paths and Symbols)」を開き、 「インクルード (Includes)」が次を含むように設定する
      ${NDKROOT}/platforms/android-9/arch-arm/usr/include
      ${NDKROOT}/sources/cxx-stl/gnu-libstdc++/4.6/include
      ${NDKROOT}/sources/cxx-stl/gnu-libstdc++/4.6/libs/armeabi-v7a/include
      /usr/local/OpenCV-2.4.5-android-sdk/sdk/native/jni/include
      

    Eclipse での Android プロジェクト作成と実行

    1. Eclipse の起動
    2. Eclipse で,次のような Android プロジェクトを新規作成
      • プロジェクト名: Hello2
      • パッケージ名: hoge.hoge.com
      • アクティビティ: MainActivity または FullscreenActivity
      1. ファイル (File)」 → 「新規 (New)」 → 「プロジェクト (Project)」 と操作する

        [image]
      2. Android アプリケーションプロジェクト (Android Application Project) を選ぶ

        [image]
      3. アプリケーション名を「Hello2」のように設定する.

        パッケージ名は 「hoge.hoge.com」のように設定

        [image]
      4. 設定

        ワークスペース内にプロジェクトを作成」をチェックする.

        [image]
      5. 設定

        [image]
      6. アクティビティーの作成

        [image]
      7. アクティビティー名の設定

        [image]
    3. Eclipse のプロジェクト・エクスプローラーで,新しいフォルダとして「jni」を作成

      [image]

      [image]
    4. jni/Android.mk の作成

      新しいファイル Android.mk を作成する.

      [image]

      [image]

      Android.mk を次のように編集する

      LOCAL_PATH := $(call my-dir)
      
      include $(CLEAR_VARS)
      
      LOCAL_MODULE    := hello
      LOCAL_SRC_FILES := hello.c
      
      include $(BUILD_SHARED_LIBRARY)
      

      [image]
    5. jni/hello.c の作成

      Eclipse のプロジェクト・エクスプローラーで, 新しいファイルとして hello.c を作成する.hello.c を次のように編集する

      ※ ファイル名「hello.c」のところは何でもよいが、Android.mk で、そのファイル名を正しく設定しておくこと.

      関数名は、「Java_<パッケージ名>_<アクティビティ名>_<文字列>」のようになる

      #include<string.h>
      #include<jni.h>
      
      jstring
      Java_hoge_hoge_com_MainActivity_stringFromJNI( JNIEnv* env, jobject thiz )
      {
          return (*env)->NewStringUTF(env, "Hello, World!\n");
      }
      

      [image]
    6. アクティビティ: MainActivity または FullscreenActivityの編集

      Android.mk で「hello.c」のように設定したので,「System.loadLibrary("hello");」のところは「hello」になる.

      ◆ アクティビティ: MainActivity の設定例

      [image]
      import android.widget.TextView;
      
          public native String  stringFromJNI();
          public native String  unimplementedStringFromJNI();
          static {
              System.loadLibrary("hello");
          }
      
              TextView  tv = new TextView(this);
              tv.setText( stringFromJNI() );
              setContentView(tv);
      

      ◆ アクティビティ: FullscreenActivity の設定例

      [image]
      import android.widget.TextView;
      
          public native String  stringFromJNI();
          public native String  unimplementedStringFromJNI();
          static {
              System.loadLibrary("hello");
          }
      
              TextView  tv = new TextView(this);
              tv.setText( stringFromJNI() );
              setContentView(tv);
      
    7. C/C++ プロジェクトへ変換 (C/C++ ネーチャー追加)

      Eclipse 上で ndk-build の操作ができるようにしたいので, プロジェクトを右クリックし、 「新規 (New)」 → 「その他 (Other)」 と操作する.

      その後、C/C++C/C++ プロジェクトへ変換 (C/C++ ネーチャー追加) (Convert to a C/C++ Porject (Adds C/C++ Nature))と操作する

      [image]
    8. Makefile プロジェクト (Makefile project) を選び,「他のツールチェーン (Other Toolchain)」を選ぶ.Finish をクリック

      これは、操作を間違えると、やり直すのがとても面倒なので、注意深く行う

      [image]
    9. パースペクティブに関する確認

      [image]
    10. プロパティーの設定

      プロジェクトを右クリックし,プロパティーを選ぶ.設定用のウインドウが現れるので,

      C/C++ ビルド (C/C++ Build)」の の ビルドコマンドを 「ndk-build」のように設定

      [image]
    11. インクルード・ディレクトリーの設定

      [image]
      ディレクトリーを 「/usr/lib/jvm/java-6-oracle/include」のように設定。この設定は、ndk-build で、このディレクトリーを使うように設定しているのではなくて、Eclipse でのコード解析などでこのディレクトリーを使うという設定

      [image]
    12. AndroidManifest.xml の minSDK

      Android NDK が android 14 以上でないと動かない、というようなエラーメッセージが出た場合には次のように修正

      [image]
    13. 実行してみる

      [image]