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
版权声明:本文标题:JNI 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1688067608h175325.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论