0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

JNIをcallbackから呼び出す

Posted at

概要

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;
}
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?