jni deleteRef for jclass and jobject
jni deleteRef for jclass and jobject
是删除JCLASS和JOVIGHT
的正确方法JNIEXPORT void JNICALL Java_method(JNIEnv *env,jobject, jobject objArray)
{
int n = env->GetArrayLength(objArray);
for (int i = 0; i<n ; ++i)
{
jobject sObject = env->GetObjectArrayElement(objArray, i);
jclass sObjectClass = env->GetObjectClass(sObject);
dosomething(sObjectClass, sObject);
env->DeleteLocalRef(sObject);
env->DeleteLocalRef(sObjectClass);
}
简短答案:
是的,这是正确的方法。呼叫DeleteLocalRef
不是必需的,但是如果objArray
大或执行时间长,则很有用。
更长的答案:
oracle参考文档状态
原始类型(例如整数,字符等)被复制 在Java和本机代码之间。任意Java对象,另一个 手,通过引用传递。VM必须跟踪所有对象 已传递给本机代码,以便这些对象是 没有被垃圾收集器释放。本机代码又必须 有办法通知VM它不再需要对象。在 此外,垃圾收集器必须能够移动对象 由本机代码引用。
因此,当本机代码确实需要该对象时,必须将本机代码使用的任何对象从本机代码的角度标记为垃圾收集的条件。JNI有两种类型的参考 - 全球和本地参考。从GetObjectArrayElement
和GetObjectClass
检索的参考文献是本地的,因为:
JNI函数返回的所有Java对象都是本地参考。
vm当本机函数返回时,自动释放所有本地参考。因此,在大多数情况下,没有必要通过DeleteLocalRef
释放这些参考,因为VM会自动释放它们。
但是,如果一个函数调用中需要很多本地引用,则该调用需要很长时间,那么在不需要的情况下,值得立即明确释放它们,并且不要等待函数返回。释放有助于VM进行更好的内存管理。
相关文章:
- C++核心准则 C35 对于接口类"A base class destructor should be either public and virtual, or protected and nonv
- 为什么C++逐位AND运算符在不同大小的操作数中表现为这样
- 为什么 Clang 不允许"and"作为函数名称?
- 使用赋值运算符重载从类中返回jobject
- 位阵列上的快速AND运算
- 是否可以在 C++03 中定义'move-and-swap idiom'等效项
- BoostPython and CMake
- OpenSSL BIO and SSL_read
- Gurobi GRBModel and GRBmodel in C++
- React Native (Android):无法通过 JNI 在 jobject 中返回字符串
- std::visit and std::variant usage
- SHBrowseForFolder with BIF_BROWSEFORCOMPUTER and SHGetPathFr
- Directx12 and keystrokes
- different between int **arr =new int [ n]; and int a[i][j]?
- C++ getenv and setenv
- Inference pytorch C++ with alexnet and cv::imread image
- Visual Studio 2019 C++ and std::filesystem
- 保证逻辑 AND 表达式中的函数调用
- python ctypes and C++ pointers
- jni deleteRef for jclass and jobject