最終更新:2018-08-31 (金) 13:11:32 (2036d)
JNI/C++からJavaを呼ぶ
http://docs.oracle.com/javase/jp/6/technotes/guides/jni/spec/invocation.html
手順
AndriodでJavaから呼ばれた関数の場合
- FindClassでクラスを取得する
- GetMethodIDでメソッドIDを取得する
- Call[戻り値の型]Methodでメソッドを呼び出す
ネイティブスレッドから呼び出す場合
- C++側ではJavaVMのインスタンスに対してGetEnv?()を呼び出す事でJNIEnv*を取得しなければならないのですが、このJNIEnv*の値はスレッドごとに変わってしまいます。
- しかも、C++側で作られたスレッドには(当然ながら)最初はJNIEnv*が作られていませんので、まずはAttachCurrentThread()しなければならない
Java VMの起動
クラスの検索
インスタンス生成
- jmethodID mid = env->GetStaticMethodID(cls, "test", "(I)V");
メソッドを呼び出して遊ぶ
- env->CallStaticVoidMethod?(cls, mid, 100);
Java VMの終了
- jvm->DestroyJavaVM();