fc2ブログ

戌印-INUJIRUSHI- (Androidあれこれ)

Androidのプログラミングをメインにしてます。記事に貼られたソースコードはダブルクリックすることで行番号をはずしてコピーすることができます。

 
1
2
4
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
01

Android NDK トラブルシューティング

Android NDK を使用する際に起こった問題の解決方法をまとめました。
その他の問題は『Android トラブルシューティング』を参照してください。


CDT プラグインがインストール / アップデートできない
ADTr20未満、または、ADTr20未満からADTr20以上にアップデートした場合、NDK Plugin が含まれていません。
その場合、ADTの再インストール、または、CDTのインストールを行います。

CDT のインストールは以下から行います。
Eclipse の [ヘルプ(H)] - [新規ソフトウェアのインストール]
Android Developer Tools Update Site - http://dl-ssl.google.com/android/eclipse/
Android_NDK_CDT_Install.png

このとき、以下のようなエラーが発生することがある。
インストールする項目の収集中にエラーが発生しました
session context was:(profile=profile, phase=org.eclipse.equinox.internal.p2.engine.phases.Collect, operand=, action=).
No repository found containing: osgi.bundle,com.android.ide.eclipse.ndk,21.0.0.v201210310015-519525
No repository found containing: org.eclipse.update.feature,com.android.ide.eclipse.ndk,21.0.0.v201210310015-519525


【対処法】
アドレスが間違っているかローカルにキャッシュされているサーバ情報が古い可能性があります。
登録されているアドレスを再ロード、または、再登録して実行してください。
(参考)ログろいど - Eclipseで No repository found containing が発生した場合

① Eclipse の [ウィンドウ(W)] - [設定(P)] から設定を開く。
② [インストール/更新] - [使用可能なソフトウェア・サイト] を選択。
③ 対象のアドレスにチェックを入れて [再ロード]

または

① [ヘルプ(H)] - [新規ソフトウェアのインストール]
② ["使用可能なソフトウェア・サイト" 設定で作業して、...] のリンクを選択。
③ 対象のアドレスにチェックを入れて [再ロード]


Android NDK: Warning: APP_PLATFORM android-14 is larger than android:minSdkVersion 8 in ./AndroidManifest.xml
アプリの対象を API 14 未満に設定した際に発生。

【対処法】
Application.mk を作成し、以下を定義する。
APP_PLATFORM := android-8


base operand of '->' has non-pointer type 'JNIEnv {aka _JNIEnv}'
言語と書式があっていない可能性があります。
(参考)ひしだま's 技術メモページ - JNIのC言語/C++側のコーディング

【対処法】(例)
C (*.c) の場合:
(*env)->NewStringUTF(env, "Hello from JNI !");
C++ (*.cpp) の場合:
env->NewStringUTF("Hello from JNI !");


Method '[メソッド名]' could not be resolved
メソッドが見つからない、または、ライブラリが読み込まれていないときに発生。

【対処法】
#include を指定。
正しく指定されているのにエラーが発生する場合、ライブラリが正しく読み込まれていない。
(参考)のねの日記 - EclipseでNDK(ndk-build)を使う方法 その2 はまった点

① Eclipse の [ウィンドウ(W)] - [設定(P)] から設定を開く。
② [C/C++] - [インデクサー] の 「次の値より大きなファイルをスキップ」 を 8MB -> 32MB に修正。
※ これで直りました。が、その後 8MB に戻しても正常のままでした…謎。


make: *** No rule to make target `jni/[class].cpp', needed by `obj/local/armeabi/objs/[project]/[class].o'. 停止。
一度コンパイルが通ったファイルを修正した場合に発生。

【対処法】
/obj 配下を全て削除。



スポンサーサイト



Android NDK プロジェクト作成

前回の記事『Android NDK 環境構築 (Eclipse+NDK+CDT)』で NDK の環境構築を行いました。
今回はプロジェクト作成と実装の仕方を簡単に説明。


■ プロジェクト作成
Eclipseメニューの [ファイル(F)] - [新規(N)] - [Android アプリケーション・プロジェクト] を選択。
通常のAndroid プロジェクトを作成します。

次に作成したプロジェクトを右クリック。
[Android ツール] - [Add Native Support ...] で NDK をサポートさせます。

これだけで NDK プロジェクトの作成は完了です。

なお NDK のサポートが追加されるとプロジェクトに /jni/obj フォルダが追加されます。
Android_NDK_Project.png

/jni
 ネイティブコードを実装する NDK のメインとなるフォルダ。
 makefile とネイティブコードを格納します。

/jni/Android.mk
 自動生成される makefile。
 モジュールやライブラリ情報を定義します。

/jni/Application.mk
 任意作成の makefile。
 アプリケーションの定義を行います。

/jni/○○.cpp
 自動生成された C++ ファイル。

/obj
 コンパイル時の中間成果物が格納されるフォルダ。
 あくまで中間成果物ですのでいじることはありません。
 完成品は /libs に保存されます。

※ コンパイル時に /obj と /libs に armeabi というフォルダが作成されます。
armeabi (ARM Embedded Application Binary Interface) はコンパイラが対象としたアーキテクチャです(変更可能)


■ 実装
管理人、C/C++未経験のため手探りでやっています。
この実装では自動生成された .cpp (C++) が上手く動かせなかったので .c (C言語) に修正しています…
内容は環境構築時に実行したサンプルの HelloJni と同じ。

--------------------------------------------------
SampleNDK.c (SampleNDK.cpp から変更)
#include <jni.h>
#include <string.h>

jstring
Java_jp_inujirushi_android_sample_samplendk_MainActivity_getStringJni(
JNIEnv* env, jobject thiz)
{
return (*env)->NewStringUTF(env, "Hello from JNI !");
}
JNIのメソッド名は以下の命名規則があります。
Java_[呼び出し元パッケージ名]_[呼び出し元クラス名]_[メソッド名]
メソッドは全て _ (アンダースコア)区切りです。
[パッケージ名]の . (ドット)も全て _ (アンダースコア)に置き換えてください。
小文字、大文字も区別されるので間違えないようにしてください。

--------------------------------------------------
Android.mk
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := SampleNDK
LOCAL_SRC_FILES := SampleNDK.c

include $(BUILD_SHARED_LIBRARY)
LOCAL_SRC_FILES で C/C++ のソースリストを指定します。
このプロジェクトではソースファイルを .cpp から .c に修正しているので以下のように修正しています。
LOCAL_SRC_FILES := SampleNDK.c

--------------------------------------------------
Application.mk (新規作成)
APP_PLATFORM := android-8
API 14 以下を対象とすると以下のエラーが発生するので対象のプラットフォームを指定します。
Android NDK: 警告: APP_PLATFORM android-14 is larger than android:minSdkVersion 8 in ./AndroidManifest.xml

--------------------------------------------------
MainActivity.java
package jp.inujirushi.android.sample.samplendk;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class MainActivity extends Activity {

/* native メソッドが実装されているライブラリをロードする */
static {
System.loadLibrary("SampleNDK");
}

/* ライブラリに登録されている native メソッドを定義する */
public native String getStringJni();

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

// native メソッドから取得した文字列を TextView に設定する
TextView textView = new TextView(this);
textView.setText(this.getStringJni());

setContentView(textView);
}
}
System#loadLibrary(String libName) でC/C++のライブラリを読み込み。
public native String [メソッド名] で使用するメソッドを定義します。
あとは定義したメソッドを呼ぶだけで実行されます。
※ native には存在しないメソッドを定義してもOKですが、実行すると java.lang.UnsatisfiedLinkError が発生します。

--------------------------------------------------
AndroidManifest.xml
特にいじるところもないので変更なし。


あとは実行して以下の結果になれば成功です。
Android_NDK_Project_Emu.png

.cpp だと実行時に java.lang.UnsatisfiedLinkError が発生したけど何が原因なのだろうか…要調査。

Android NDK 環境構築 (Eclipse+NDK+CDT)

Android NDK (Native Development Kit) とはアプリケーションの一部(または全て)をネイティブコード(機械語)である C/C++ 等を用いて高速化するための仕組みです。

※ アプリ開発に携わっているとネイティブアプリと耳にすることがあると思いますが別物です。
参考サイト: TM Life - Webアプリとネイティブアプリの違いについてまとめてみた

Android NDK の環境は、Android SDK同様に導入当初よりずいぶん変わりました。
ADTr20 からは NDK Plugin (Android ネイティブ開発ツール) が含まれているため、コンパイルのために Cygwin 等をインストールする必要がなくなっています。
参考サイト: Happy my life - ADTr20ではNDKなプロジェクトが簡単に作れるようになってた

※ ADTr19以下からのアップデートの場合には NDK Plugin が含まれないため、再インストール、または、Eclipse から [ヘルプ] - [新規ソフトウェアのインストール] でインストールする必要があります。

Cygwin が不要になったことで、Eclipse のみで開発可能となりました。
そこで、Eclipse 上で C/C++ を開発するための CDT (C/C++ Development Tools) を使います。
この CDT は ADT(のNDK plugin) に含まれているので、ADTが最新の状態になっていればとくに意識する必要もありません。

以下、環境構築の手順。

【環境】
Windows 7 / 64bit
Eclipse 4.2 Juno
ADT/Android SDK r21 (CDT含む)
Android NDK r8d

※ Eclipse + ADT は Android Developers の ADT Bundle for Windows を使用しています

【Android NDK インストール】
すでに Eclipse + ADT がインストール済みであれば Android NDK をインストールするだけで環境構築完了です。
Eclipse + ADT のインストールがまだの人はこちら ⇒ Android 開発環境構築(2回目)

Android Developers から環境に合わせた Android NDK をダウンロードします。
http://developer.android.com/tools/sdk/ndk/index.html
※ 2013/01/03 時点の最新版は Android NDK r8d

Windows 環境であれば android-ndk-r8d-windows.zip をダウンロード。
ダウンロードしたファイルは任意のディレクトリで解凍します。
例) C:\android\android-ndk-r8d

解凍が完了したら、Eclipse の設定([ウィンドウ] - [設定])を開きます。
設定を開いたら、[Android] - [NDK] の NDK Location に解凍したディレクトリを指定して適用します。
Android_NDK_Setup.png

【環境変数設定】
コンソールから NDK Plugin を実行するために環境変数を設定します(任意)

Android NDK のホームを設定
Android_NDK_HOME.png
ANDROID_NDK_HOME
C:\android\android-ndk-r8d


Android NDK を PATH に追加
Android_NDK_Path.png
PATH
%ANDROID_NDK_HOME%;


【動作確認】
Android NDK の動作確認として、NDK に含まれているサンプルプロジェクトを実行します。
もっともシンプルな HelloJni をインポートします。

Eclipse の [ファイル] - [インポート] を選択。
[Android] - [Existing Android Code Into Workspace] から以下のディレクトリからプロジェクトをインポートします。

C:\android\android-ndk-r8d\samples
Android_NDK_Sample.png

プロジェクトをインポートしたら、プロジェクトを右クリック。
[Android ツール] - [Add Native Support ...] を実行して、プロジェクトに NDK をサポートさせます。

Add Native Support が出ない or 実行できない場合は Eclipse を再起動してください。
再起動してもできない(or できない)場合は、NDK が正しく設定されているか確認してください。

あとは通常の実行(Android アプリケーション実行)で以下の画面が表示されれば成功です。
※ 実行には Android 1.5 (API 3) のAVDが必要になります
Android_NDK_Hello.png

プロフィール

とむ・やむくん

Author:とむ・やむくん
管理人について

Windows 7 / 64bit
Eclipse 4.2 Juno (日本語パッチ済)

スポンサーサイト
最新トラックバック
検索フォーム
ブロとも申請フォーム
QRコード
QR
Twitter
2013/01/04 19:00 カウント開始