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

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

 
1
2
3
4
5
6
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
08

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

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 が発生したけど何が原因なのだろうか…要調査。
スポンサーサイト

Comments

Leave a Comment


Body
プロフィール

とむ・やむくん

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

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

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

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。