2011-12-08 3 views
12

jjateArray öğesini jni dilinde yerel c dizesine (char *) dönüştürmeye çalışıyorum? Maalesef, bunun nasıl yapılacağına dair bir belge bulamıyorum. C kodunda aşağıdaki prototip ile bir java işlevi çağırıyorum. c kodda jwiteArray, native char * jni dilinde nasıl dönüştürülür?

public static byte[] processFile(byte[] p_fileContent) 

bir bayt dizisi geri bu işlevi yürütmesini. Bu bayt dizisinin içeriği bir java dizesidir. Ama onu bir c dizgisine dönüştürmem gerekiyor.

jbyteArray arr = (jbyteArray) env->CallObjectMethod(clsH, midMain, jb); 
printf("%s\n", (char*) arr); 

cevap

17

Sana GetByteArrayElements ve ReleaseByteArrayElements kullanmak inanıyoruz. gibi bir şey:

boolean isCopy; 
jbyte* b = GetByteArrayElements(env, arr, &isCopy); 

Dizideki verilere erişmek için bu noktada char* için b döküm gerekir. Bu verilerin bir kopyasını oluşturmak unutmayın, bu nedenle ReleaseByteArrayElements kullanarak bellek serbest bırakmak için emin olmak istersiniz:

ReleaseByteArrayElements(env, arr, b, 0); 

son parametre b değişiklik nasıl işleneceğini belirten bir moddur. 0, değerlerin arr'a geri kopyalandığını belirtir. Verileri arr'a geri kopyalamak istemiyorsanız, bunun yerine JNI_ABORT'u kullanın.

Daha fazla ayrıntı için JNI Reference'a bakın.

+0

Bağlantınız bozuk. Lütfen güncelle. –

+0

@DRH Bir 1.5 linke 1.4.2 bağlantısını güncellemek pek bir gelişme değildir. – EJP

+0

Dikkat, sonlandırma sona erecek. Genel olarak, dosya içeriği boş bırakılmaz; C (++) dize işlevleri bunun üzerinde boğuşabilir. Bu konuda güvenilir bir şekilde çalışabilmek için, dosya baytını bir baytlık bir bayttan daha büyük bir alana kopyalamanız ve son baytı sıfır olarak ayarlamanız gerekir. –