2012-05-29 83 views
2

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

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; 
} 
} 

回答

0

局部变量总是在堆栈段中创建,因此在从函数返回后被破坏。此图可能有所帮助。

Local variable assignment

0

甲引自here

本地参考之内创建它,而只有内的 本机方法的一个调用的 本地方法的动态上下文是有效的。一旦本地方法返回,在本地方法的执行 期间创建的所有本地引用都将被释放。

因此,您可能不会释放您的本地参考,因为它会自动释放。

+3

其实你可以免费。如果你正在创建它们(例如在某个循环中),你应该这样做,因为默认情况下你只能得到16个(你可以通过EnsureLocalCapacity方法增加它)。从这里引用((http://java.sun.com/docs/books/jni/html/refs.html)):“当本地方法返回给调用者时,Java虚拟机为你释放它们。但是,有当你,JNI程序员应该明确地释放本地引用以避免内存使用过多时,请考虑以下情况......“ –