Androidは、C ++(NDK)およびJava(SDK)言語をサポートしています。 C ++言語を使用する場合、C ++コードとJavaと対話することが特に重要です。ダウンロードしたNDKパッケージでサンプル/hello-jniを参照する簡単な例があります。
JavaはC ++を呼び出します
新しいAndroidプロジェクトを作成し、次のクラスを作成します。
パッケージcom.example.testjni; public class textjni {// c static {system.loadLibrary( "jniinterface"); } public static native int getInt(); public staticネイティブ文字列getString();}上記は2つのネイティブメソッドを宣言し、GetIntとGetStringのメソッド実装がC ++(libjniinterface.so)で与えられることを示します。
クラスディレクトリで次のコマンドを実行して、ネイティブに対応する実装ファイルを生成します。
javah com.example.testjni.TextJni # Note that if you want to have an Android SDK class, you need to specify a classpath, such as javah -classpath /Users/Richard/dev/android/sdk/platforms/android-19/android.jar:./bin/classes com.togic.gameengine.GFRenderer
ヘッダーファイルを生成してコピーし、JNIフォルダーを作成し、CPP実装ファイルを作成します
com_example_testjni_textjni.cpp:#include <stdio.h> #include <stdlib.h> #include "com_example_testjni_textjni.h" int sum(){int x、y; x = 100; y = 1000; x += y; x;} // com_example_textjni_textjni.h jniexport jint jnicall java_com_example_testjni_textjni_getint(jnienv * env、jclass cls){return sum();} jniexport jstring jnicall java_com_example_testjni_textjni_getString(jnienv * env、jclass cls){return env-> newstringutf( "hellondk!");}ここでは相互コンパイルが使用されており、C ++コードを整理するにはAndroid.mkが必要です。
jni/の下に新しいandroid.mkファイルを作成します
Android.mk:local_path:= $(call my-dir)に含まれる$(clear_vars)local_module:= jniinterfacelocal_src_files:= com_example_testjni_textjni.cpp#local_c_includes:= $(local_path)
次に、NDK:NDK-Buildのツールを使用して、動的リンクライブラリ:libjniinterface.sを生成できます。
生成されたライブラリファイルは、以前のJavaファイルで呼び出すことができます。
C ++コールJava
上記の例では、GetStringメソッドでJNIを使用してJavaを呼び出すことができます。
jniexport jstring jnicall java_com_togic_testjni2_textjni_getString(jnienv * env、jclass cls){jclass textjni; jobject instextjni; jmethodid getCurrint; jnienv* jnienv = env; textjni = jnienv-> findclass( "com/togic/testjni2/textjni"); jmethodid construction_id = jnienv-> getMethodid(textjni、 "init"、 "()v"); insttextjni = jnienv-> newObject(textjni、construction_id); getCurrint = jnienv-> getstaticMethodid(textjni、 "getCurrint"、 "()i"); // Java Static Method Jint jiref = jnienv-> callstaticintmethod(textjni、getCurrint); // clean jnienv-> deletelocalref(textjni); jnienv-> deletelocalref(insttextjni); std :: string strref = "hellondk!" + view-> getStaticString(); return env-> newstringutf(strref.c_str());}まず第一に、JNI.Hの関数がCとC ++言語を区別することは注目に値します。 C ++の場合、以下は一般的に次のとおりです。
jclass clazz = env-> findclass(classname);
そしてCのために:
jclass clazz =(*env) - > findclass(env、classname);
getMethodidの3番目のパラメーターは、次のように取得できます。
Javap -Sパッケージ名。クラス名はメソッドの署名を取得します
添付されたJNIデータ型変換
jstring to char *
const char nativestring =(env) - > getstringutfchars(env、javastring、0);
leleseStringutfchars()によってリリースされるまで有効である文字列のUTF-8文字配列にポインターを返します。
(*env) - > releastringutfchars(env、javastring、nativestring);
char * to jstring
jstring jstr =(env) - > newstringutf(env、char utf)
UTF-8文字配列を使用して、新しいJava.lang.Stringオブジェクトを作成します。
他のタイプすべてのコピーをメモに選択しますjavaタイプローカルcタイプ説明
Boolean JBooleの署名、8ビット
バイトjbyte unsigned、8ビット
char jchar unsigned、16ビット
16ビットの短いJShort署名
int jint署名、32ビット
長いjlong署名、64ビット
フロートJFloat 32ビット
ダブルJDouble 64ビット
void void n/a