Local Reference不可存入到一个static变量里,Global Reference可存入一个static变量里

2024-08-21 17:08

本文主要是介绍Local Reference不可存入到一个static变量里,Global Reference可存入一个static变量里,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

来看下如下代码的stringClass:

/* This code is illegal */
jstring MyNewString(JNIEnv *env, jchar *chars, jint len)
{static jclass stringClass = NULL;jmethodID cid;jcharArray elemArr;jstring result;if (stringClass == NULL) {stringClass = (*env)->FindClass(env,"java/lang/String");if (stringClass == NULL) {return NULL; }}/* It is wrong to use the cached stringClass here, because it may be invalid. */cid = (*env)->GetMethodID(env, stringClass,"<init>", "([C)V");elemArr = (*env)->NewCharArray(env, len);result = (*env)->NewObject(env, stringClass, cid, elemArr);(*env)->DeleteLocalRef(env, elemArr);return result;
}JNIEXPORT jstring JNICALL Java_C_f(JNIEnv *env, jobject this)
{char *c_str = ...;...return MyNewString(c_str,len);
}//Java层调用两次Java_C_f接口:
...
... = C.f();         // The first call is perhaps OK.
... = C.f();         // This would use an invalid local reference.
...

解释:

FindClass返回了java.lang.String的localRef(stringClass),在第一次C.f()方法return后,虚拟机释放了C.f()期间创建的所有localRef,包括stringClass.

但stringClass!=NULL,第二次调用C.f()时,MyNewString()不会再调用FindClass,不会生成新的localRef.此时stringClass是无效的localRef,可能导致系统crash.

Global Reference可存入一个static变量里:

/* This code is OK */
jstring MyNewString(JNIEnv *env, jchar *chars, jint len)
{static jclass stringClass = NULL;...if (stringClass == NULL) {jclass localRefCls = (*env)->FindClass(env, "java/lang/String");if (localRefCls == NULL) {return NULL; /* exception thrown */}/* Create a global reference */stringClass = (*env)->NewGlobalRef(env, localRefCls);if (stringClass == NULL) {return NULL; /* out of memory exception thrown */}/* The local reference is no longer useful */(*env)->DeleteLocalRef(env, localRefCls);}...
}

参考文献:

[1] The Java™ Native Interface Programmer’s Guide and Specification.pdf

这篇关于Local Reference不可存入到一个static变量里,Global Reference可存入一个static变量里的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1093765

相关文章

变量与命名

引言         在前两个课时中,我们已经了解了 Python 程序的基本结构,学习了如何正确地使用缩进来组织代码,并且知道了注释的重要性。现在我们将进一步深入到 Python 编程的核心——变量与命名。变量是我们存储数据的主要方式,而合理的命名则有助于提高代码的可读性和可维护性。 变量的概念与使用         在 Python 中,变量是一种用来存储数据值的标识符。创建变量很简单,

native和static native区别

本文基于Hello JNI  如有疑惑,请看之前几篇文章。 native 与 static native java中 public native String helloJni();public native static String helloJniStatic();1212 JNI中 JNIEXPORT jstring JNICALL Java_com_test_g

AI基础 L9 Local Search II 局部搜索

Local Beam search 对于当前的所有k个状态,生成它们的所有可能后继状态。 检查生成的后继状态中是否有任何状态是解决方案。 如果所有后继状态都不是解决方案,则从所有后继状态中选择k个最佳状态。 当达到预设的迭代次数或满足某个终止条件时,算法停止。 — Choose k successors randomly, biased towards good ones — Close

MySQL脏读、不可重复读、幻读(虚读)

事务的特性: 原子性:指处于同一个事务中的多条语句是不可分割的。一致性:事务必须使数据库从一个一致性状态变换到另外一个一致性状态。比如转账,转账前两个账户余额之和为2k,转账之后也应该是2K。隔离性:指多线程环境下,一个线程中的事务不能被其他线程中的事务打扰持久性:事务一旦提交,就应该被永久保存起来。 事务隔离性问题: 如果不考虑事务的隔离性,会出现以下问题: 脏读:指一个线程中的事务读取到

深入理解PHP7之REFERENCE

REFERENCE 上一章说过引用(REFERENCE)在PHP5的时候是一个标志位, 而在PHP7以后我们把它变成了一种新的类型:IS_REFERNCE. 然而引用是一种很常见的应用, 所以这个变化带来了很多的变化, 也给我们在做PHP7开发的时候, 因为有的时候疏忽忘了处理这个类型, 而带来不少的bug. 最简单的情况, 就是在处理各种类型的时候, 从此以后我们要多考虑这种新的类型, 比如

JS_变量

二、JS的变量 JS中的变量具有如下特征 1 弱类型变量,可以统一声明成var 2 var声明的变量可以再次声明 3 变量可以使用不同的数据类型多次赋值 4 JS的语句可以以; 结尾,也可以不用;结尾 5 变量标识符严格区分大小写 6 标识符的命名规则参照JAVA 7 如果使用了 一个没有声明的变量,那么运行时会报uncaught ReferenceError: *** is not de

使用条件变量实现线程同步:C++实战指南

使用条件变量实现线程同步:C++实战指南 在多线程编程中,线程同步是确保程序正确性和稳定性的关键。条件变量(condition variable)是一种强大的同步原语,用于在线程之间进行协调,避免数据竞争和死锁。本文将详细介绍如何在C++中使用条件变量实现线程同步,并提供完整的代码示例和详细的解释。 什么是条件变量? 条件变量是一种同步机制,允许线程在某个条件满足之前进入等待状态,并在条件满

axure之变量

一、设置我们的第一个变量 1、点击axure上方设置一个全局变量a = 3 2、加入按钮、文本框元件点击按钮文档框展示变量值。 交互选择【单击时】【设置文本】再点击函数。 点击插入变量和函数直接选择刚刚定义的全局变量,也可以直接手动写入函数(注意写入格式。) 这样点击按钮时就直接展示刚刚设置的全局变量3了。 2、更改变量值 在新建交互里点击设置变量值。 将a变量设置成等于10. 将新

shell脚本中变量中字符串替换的测试 /和//的区别

test_char=abbbcbbbf echo "bf:test_char = " $test_char test_char=${test_char/bbb/ddd} echo "af:test_char = " $test_char 输出: bf:test_char =  abbbcbbbf af:test_char =  adddcbbbf 只匹配第一个

eclipse中相同变量显示变色设置

java文件的设置"Window"-"preferences"-"Java"-"Editor"-"Mark Occurrences"复选框勾选 js文件的设  置"Window"-"preferences"-"web"-"javascript"-"Mark Occurrences"复选框勾选 。