2012-05-29 64 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程序員應該明確地釋放本地引用以避免內存使用過多時,請考慮以下情況......「 –