admin 管理员组

文章数量: 887021

JNI

局部引用问题

1.一个局部引用仅在创建它的native函数及该函数调用的函数中有效。在一个native函数执行期间创建的所有局部引用将在该函数返回时被释放。
2.千万不要写一个native函数来保存一个局部引用在静态变量或全局变量中并期望在以后的函数调用中使用。

// instance是一个局部引用,不能使用1中的方式进行赋值。当该函数返回后,将释放
// 包含在this->instance变量中的局部引用
JniCallbackHelper::JniCallbackHelper(JavaVM *pVM, _JNIEnv *pEnv, jobject instance) {this->jniVm = pVM;this->env = pEnv;// this->instance = instance; // 1.错误示范// 2. jobject一旦涉及到跨方法,跨线程,需要创建全局引用this->instance = env->NewGlobalRef(instance);jclass clz = env->GetObjectClass(instance);jmd_prepared = env->GetMethodID(clz, "onPrepared", "()V");
}

JNIEnv跨线程问题

1.JNIEnv是当前线程的上下文,如果在C++子线程中想要调用JAVA层的代码,那么需要使用JavaVM ->AttachCurrentThread(&env_child, 0);来创建一个子线程对应的JNIEnv,然后再调用JAVA层的代码。

// 子线程 JavaVM *jniVm
JNIEnv * env_child;
jniVm->AttachCurrentThread(&env_child, 0);
env_child->CallVoidMethod(instance, jmd_prepared);
jniVm->DetachCurrentThread();

JavaVM初始化问题

jint JNI_OnLoad(JavaVM* jvm, void* reserved) {JavaVm *javaVM = jvm;return JNI_VERSION_1_6;
}

本文标签: JNI