最終更新:2018-08-31 (金) 13:11:32 (2500d)  

JNI/C++からJavaを呼ぶ
Top / 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の起動

  • JNI_CreateJavaVM?(&jvm, &env, &vm_args);

クラスの検索

インスタンス生成

  • jmethodID mid = env->GetStaticMethodID(cls, "test", "(I)V");

メソッドを呼び出して遊ぶ

  • env->CallStaticVoidMethod?(cls, mid, 100);

Java VMの終了

  • jvm->DestroyJavaVM();

参考

JNI/シグネチャ

サンプル

関連

参考