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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值