释放android JNI中的本地引用
在我编写的android代码的jni层中,我将从jni层返回一个数组到java层。在传递结果之前,我使用DeleteLocalRef()释放本地引用。我只是想确保我写的代码是正确的。请查找下面的代码。任何帮助都将不胜感激释放android JNI中的本地引用,android,android-ndk,Android,Android Ndk,在我编写的android代码的jni层中,我将从jni层返回一个数组到java层。在传递结果之前,我使用DeleteLocalRef()释放本地引用。我只是想确保我写的代码是正确的。请查找下面的代码。任何帮助都将不胜感激 extern "C" { JNIEXPORT jbyteArray JNICALL Java_com_jni_btRead(JNIEnv* env, jobject) { unsigned char* reply = btRead(); jbyteArray
extern "C"
{
JNIEXPORT jbyteArray JNICALL Java_com_jni_btRead(JNIEnv* env, jobject)
{
unsigned char* reply = btRead();
jbyteArray jba;
if(reply)
{
jba = env->NewByteArray(2048);
env->SetByteArrayRegion(jba, 0, 2048, reinterpret_cast<jbyte*>(reply));
}
else
{
jba = env->NewByteArray(0);
}
env->DeleteLocalRef(jba);
return jba;
}
}
extern“C”
{
JNIEXPORT jbyteArray JNICALL Java_com_jni_btRead(JNIEnv*env,jobject)
{
无符号字符*reply=btRead();
jbyteArray-jba;
若有(答复)
{
jba=env->NewByteArray(2048);
env->SetByteArrayRegion(jba,0,2048,重新解释(回复));
}
其他的
{
jba=env->NewByteArray(0);
}
env->DeleteLocalRef(jba);
返回jba;
}
}
引用自:
本地引用仅在的动态上下文中有效
创建它的本机方法,并且仅在
本地方法。执行期间创建的所有本地引用
一旦本机方法返回,将释放本机方法的
所以您可能无法释放本地引用,因为它会自动释放。本地变量总是在堆栈段中创建,因此从函数返回后会被销毁。这个图表可能会有所帮助
实际上,你可以释放它们。如果您要创建很多(例如,在某个循环中),您应该这样做,因为默认情况下,您只能获得16个(您可以使用EnsureLocalCapacity方法增加)。从这里引用():“当本地方法返回给调用方时,java虚拟机为您释放它们。但是,有时,JNI程序员应该明确地释放本地引用,以避免内存使用过多。请考虑以下情况……”