释放android JNI中的本地引用

释放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

在我编写的android代码的jni层中,我将从jni层返回一个数组到java层。在传递结果之前,我使用DeleteLocalRef()释放本地引用。我只是想确保我写的代码是正确的。请查找下面的代码。任何帮助都将不胜感激

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程序员应该明确地释放本地引用,以避免内存使用过多。请考虑以下情况……”