AndroidでJNIを使う方法
1.Android側作る
例だとTextViewに表示するだけでつまらないのでボタン押したら表示にする
とりあえずマネージャ
package com.hoge.jnitest public class JniManager { /* jni load lib*/ static { System.loadLibrary("JNItestNative"); } /* jni native method*/ public native String getTestStringFromNative(); }
次にActivity
package com.hoge.jnitest; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.TextView; public class JniTestActivity extends Activity { private View jniButton; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); final JniManager jm = new JniManager(); setContentView(R.layout.activity_jni_test); jniButton = (Button)findViewById(R.id.jniButton); jniButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { /* call jni method */ String strText = jm.getTestStringFromNative(); /* set jni text */ TextView jniText = (TextView)findViewById(R.id.jniText); jniText.setText(strText); } }); } }
こんなButtonとTextViewを適当に追加
<TextView android:id="@+id/jniText" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:text="@string/hello_world" /> <Button android:id="@+id/jniButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/textView1" android:layout_below="@+id/textView1" android:text="@string/jni_button" />
これでビルドとおったら次へどうぞいってくだしぃ。
ワークスペースのbin\classes\com\hoge\jnitest下にクラスファイルできてるの確認しといてね
2.Jniヘッダ作る
JDKについてくるjavahをこんな感じに使うよ
javah -classpath bin -d jni <jni native methodを定義とかしてるクラス>
今回だと
cd <ワークスペース>
javah -classpath bin -d jni com.hoget.JniManager
クラスパスはclasspathオプションで指定することで別フォルダでも行けるらしいです。
javah -classpath bin\classes -d jni com.hoget.JniManager
出来るとワークスペースにJniフォルダができて、
その中にヘッダがある
3.Jni側つくる
external下にlibJNItestNativeフォルダ作る
2で作ったヘッダコピー
makeファイルとcソース書くよ
Android.mk
LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_SRC_FILES := \ getTestStringFromNative.c LOCAL_C_INCLUDES := \ $(JNI_H_INCLUDE) \ LOCAL_MODULE := libJNItestNative LOCAL_PRELINK_MODULE := false include $(BUILD_SHARED_LIBRARY)
getTestStringFromNative.c
中身の関数名はヘッダからこぴってくる
#include "com_hoge_JniManager.h" JNIEXPORT jstring JNICALL Java_com_hoge_JniManager_getTestStringFromNative ( JNIEnv *env, jobject obj ) { return (*env)->NewStringUTF(env, (char *)"from Native Code String"); }
ビルド:
cd external\libJNItestNative
mm
成果物:
out/target/product/generic/system/lib/
置き場所:
#adb push libJNItestNative.so /system/lib
system下がreadonryだったらmmじゃなくてフルビルド
mmでエラーチェックしてからのほうが効率いいかも。
----
追記:systemパーティションをRWでリマウントするんだったらこれ。
リマウント対策がされてない限りこれでpush出来るようになる
adb shell mount -o rw,remount /system
---
追記2:javahはJDKインストールすると付いてくる
C:\Program Files\Java\jdk1.7.0_11\binみたいなところにあると思うので、
各自PATH通しましょう
0 件のコメント:
コメントを投稿