C++ 使用jni时如何清理jfloat

C++ 使用jni时如何清理jfloat,c++,java-native-interface,C++,Java Native Interface,我知道当我的jni方法结束并且我一直在使用jfloatArray时,我应该调用: env->ReleaseFloatArrayElements(vec,in,0) 关于jfloat,如何对非数组类型的单个原语执行相同操作?您只需在JNI接口可能已分配内存或其他资源的情况下进行清理。基本类型,如jfloat,是用于基本C++*类型*(通常为float)的typedef,并通过副本传递;当您声明一个jfloat时,它只是堆栈上的一个浮点类型,当您离开它的作用域时它就会消失。您只需要在JNI接口可能已

我知道当我的jni方法结束并且我一直在使用jfloatArray时,我应该调用:

env->ReleaseFloatArrayElements(vec,in,0)


关于
jfloat
,如何对非数组类型的单个原语执行相同操作?

您只需在
JNI
接口可能已分配内存或其他资源的情况下进行清理。基本类型,如
jfloat
,是用于基本C++*类型*(通常为float)的typedef,并通过副本传递;当您声明一个
jfloat
时,它只是堆栈上的一个浮点类型,当您离开它的作用域时它就会消失。

您只需要在
JNI
接口可能已分配内存或其他资源的情况下进行清理。基本类型,如
jfloat
,是用于基本C++*类型*(通常为float)的typedef,并通过副本传递;当您声明一个
jfloat
时,它只是堆栈上的一个浮点类型,当您离开它的作用域时它就会消失。

如果它是一个简单的jfloat(实际上是一个类型定义的“float”),它将被堆栈删除,但是,如果它是一个jfloat*数组,在本机端用newmalloc分配,则需要用delete[]free清理它。如果它是一个简单的jfloat(实际上是一个typedefed“float”),则它将被堆栈删除,但是,如果它是一个jfloat*数组,在本机端用newmalloc分配,则需要用delete[]free清理。简短回答:不必。既然你问我,你应该明白这一点

如果说你必须只清理那些你必须清理的地方,那就太好了。不幸的是,你必须推断或使用其他知识来说明。文档中明确了哪些“发布”功能将与其他功能成对使用。事实证明,如果有一个释放函数,那么您必须使用它。此类释放功能也是唯一的功能之一


您可以清理本地引用;如果没有,JNI会在本机方法返回时自动清理它们。本地引用的数量是有限制的,因此应该清除循环内的本地引用(如果它们是在循环内分配的),或者清除(不透明的)辅助函数中的本地引用(如果它们是由循环分配的)

简单回答:你不必这么做。既然你问我,你应该明白这一点

如果说你必须只清理那些你必须清理的地方,那就太好了。不幸的是,你必须推断或使用其他知识来说明。文档中明确了哪些“发布”功能将与其他功能成对使用。事实证明,如果有一个释放函数,那么您必须使用它。此类释放功能也是唯一的功能之一


您可以清理本地引用;如果没有,JNI会在本机方法返回时自动清理它们。本地引用的数量是有限制的,因此应该清除循环内的本地引用(如果它们是在循环内分配的),或者清除(不透明的)辅助函数中的本地引用(如果它们是由循环分配的)

描述堆栈的使用是一个便于理解的模型。但是,编译器不需要将堆栈用于局部变量甚至参数(除非指定了特定的调用约定)。描述堆栈的使用是一个便于理解的模型。但是,编译器不需要对局部变量甚至参数使用堆栈(除非指定了特定的调用约定)。