为什么我不应该在JNI中重用jclass和或jmethodID?

为什么我不应该在JNI中重用jclass和或jmethodID?,第1张

为什么我不应该在JNI中重用jclass和/或jmethodID?

这里的规则很明确。方法ID和字段ID的值是永远不变的。您可以挂在他们身上。查找需要一些时间。

jclass
另一方面,通常是 本地参考 。本地引用最多只能在一次调用JNI函数的过程中保留下来。

如果需要优化,则必须要求JVM为您提供全局引用。获取并保留对诸如的通用类的引用并不少见

java.lang.String

当然,持有此类对类的引用将防止它(类)被垃圾回收。

jclass local = env->FindClass(CLS_JAVA_LANG_STRING);_CHECK_JAVA_EXCEPTION(env);java_lang_string_class = (jclass)env->NewGlobalRef(local);_CHECK_JAVA_EXCEPTION(env);env->DeleteLocalRef(local);_CHECK_JAVA_EXCEPTION(env);

检查宏调用:

static inline voidcheck_java_exception(JNIEnv *env, int line){    UNUSED(line);    if(env->ExceptionOccurred()) {#ifdef DEBUG        fprintf(stderr, "Java exception at rlpjni.cpp line %dn", line);        env->ExceptionDescribe();    abort();#endif        throw bt_rlpjni_java_is_upset();    }}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5488497.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-12
下一篇 2022-12-12

发表评论

登录后才能评论

评论列表(0条)

保存