2011-05-02 6 views
65

kitabı "Essential JNI'yı: Java Native Interface" Rob Gordon tarafından bir C dizesine bir jstring dönüştürmek için aşağıdaki kod örneği içerir: sadece isCopy doğrudur ReleaseStringUTFChars eğer çağrılarıEğer ReleaseStringUTFChars çağırayım mı?

const char* utf_string; 
jboolean isCopy; 
utf_string = env->GetStringUTFChars(str, &isCopy); 
/* ... use string ... */ 
if (isCopy == JNI_TRUE) { 
    env->ReleaseStringUTFChars(str, utf_string); 
} 

Not söyledi.

Ama kitap Java Native Interface: Programmer's Guide and Specification (alternatif link: http://192.9.162.55/docs/books/jni/html/objtypes.html#5161) diyor ki:

ReleaseString-Chars çağrı GetStringChars * isCopy JNI_TRUE veya JNI_FALSE için grubu olup olmadığına gereklidir. ReleaseStringChars ya kopya serbest bırakır ya da GetStringChars kopyasını geri belirtmemesine üzerine olarak, örnek unpins.

Bu, Gordon'un kitabındaki bir hata olduğunu farz ediyorum.

+1

nerede 'str' defiined edilir? – SomethingSomething

cevap

55

Evet, varsayım (her zaman ReleaseStringUTFChars çağırmalıdır) doğrudur.

+0

Aramayacaksa ne olur? – Tama

+0

Bellek (süresiz bellek gerektiğini JVM inanacak) sızdırılmış edilecektir. –

+0

Elbette! Ancak, int, double gibi başka bir veri türü için neden ücretsiz ayrılmış bellek işlevimiz yok. RealseInt (arg, arg), ReleaseDouble (arg, arg) ... veya benzeri bir şey olmalı mı? – Tama