概要
JNIをcallbackから呼び出す時、エラーが発生したためその対処法について
callbackからJNIを使用するとエラーが発生する
以下のコードでJavaVMとJNIEnvを取得しておく。そのJNIEnvをcallbackから使用するとエラーが発生する。
#include <jni.h>
JavaVM* jvm;
JNIEnv* env;
jint JNI_OnLoad(JavaVM *vm, void* reserved) {
jint jni_version = JNI_VERSION_1_6;
if (vm->GetEnv(reinterpret_cast<void **>(&env), jni_version) != JNI_OK) {
return JNI_ERR;
}
jvm = vm;
return jni_version;
}
JNIEnv* getEnv() {
return env;
}
対処法
JNIEnvはカレントスレッドのみで使用可能らしく、callbackから使用する場合には新しく取得する必要があるらしい。
callbackから使用する場合には以下のコードでJNIEnvを取得する。
JNIEnv* getCurrentThreadEnv() {
JNIEnv* _env;
jvm->AttachCurrentThread(&_env, NULL);
return _env;
}