
[Android]JNI(ネイティブコード)のサンプル#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]設定画面を一定回数開くごとにポップアップダイアログを表示する...