サンプルプログラム工場

AAKAKA Appで使われているプログラムのサンプルコードをそのまま公開!

サンプルプログラム工場 > android > [Android]JNI(ネイティブコード)のサンプル#tryJni00
Google Play AAKAKAxSOFTへ

[Android]JNI(ネイティブコード)のサンプル#tryJni00

実行ファイル(APK)やサンプル(zip)をダウンロードする
tryJni00の実行イメージ

JNIを使ってみる。
JNI使ってC/C++のコード呼び出すと処理が速くなるらしいので、重そうな処理はそちらに書くようにしてみる。
特にOpenGLやら物理エンジンを使うときにJNI使ってやらないと重くてたまんないらしい。

●JNIでコードを書くにはまずAndroid NDKをインストールしないとだめ。

http://developer.android.com/tools/sdk/ndk/index.html

ここからダウンロードしてインストール
解凍したものを「C:\」へコピー(好きなフォルダでいいけど、環境変数もそこを指定する)

●環境変数を設定する
Win7の場合は
>スタートボタンを押して「環境変数」で検索。
>ユーザーの環境変数で「新規」ボタンを押す
>変数名「ANDROID_NDK_HOME」
>変数値「C:\android-ndk-r8e」←任意のフォルダ
>もう一度、ユーザーの環境変数で「新規」ボタンを押す
>変数名「Path」
>変数値「%ANDROID_NDK_HOME%」←任意のフォルダ

●最近のADTの場合は特に何もしなくても以下の手順でEclipseからビルドができる
>プロジェクトを右クリック「Androidツール」のメニューから「Add Native Support」
これでjniフォルダができて、勝手に「Android.mk、プロジェクト名.cpp」ができあがる。
高速化したい処理をプロジェクト名.cppの中に書けばいい。

▲検索した事
 android JNI
 android NDK
 android インストール
 android JNI 引数 文字列

○開発環境
 Eclipse IDE バージョン: 4.2.1

package com.example.tryjni00;

import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
import android.widget.TextView;

public class ActivityTryJni00 extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_try_jni00);
		
		TextView tv = (TextView)this.findViewById(R.id.textView1);
		tv.setText(stringFromJNI("Javaから渡した文字列"));
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.activity_try_jni00, menu);
		return true;
	}

	// C/C++側で作った関数
	// jniのtryJni00.cppからひっぱってくる
	public native String stringFromJNI(String tail);

	
	// ライブラリをロードする
	// これをするとライブラリから関数を引っ張ってこれるようになる
	// 無いとエラー
	static {
		System.loadLibrary("tryJni00");
	}
	
}

こちら側に実行を高速化したいコードを書き込む

#include <string.h>
#include <jni.h>
#include <cstring>

// 高速化したい処理
// 関数名に注意する
// 先頭にJava_パッケージ名("."を"_"にしたもの)_関数名
// ちなみにCとC++では書き方が微妙に変わる。これはC++の書き方、どっちかに統一して使うようにする。
extern "C" jstring Java_com_example_tryjni00_ActivityTryJni00_stringFromJNI(
		// ↓この二つは引数に必ず入れないといけないよ!
		JNIEnv* env, jobject thiz,
		// 関数の引数(Javaから呼び出すときは引数はこれだけ)
		jstring tail) {

	char buf[256];
	const char* pText = "引数はこれだ!→";

	const char* str = env->GetStringUTFChars(tail, 0);


	strncpy(buf, pText, 256);
	strncat(buf, str, 256);

	env->ReleaseStringUTFChars(tail, str);

	//return env->NewStringUTF((const char*)strcat("引数はこれ→", (const char*)tail));
	return env->NewStringUTF(buf);
}

サンプルプロジェクトをダウンロード

, , ,

[Android]ライブ壁紙(LiveWallPaper)のサンプル#tryLiveWallPaper00 [Android]設定画面を一定回数開くごとにポップアップダイアログを表示する...

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です


*

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>