2011-12-08 56 views
12

我想在jni中將jbyteArray轉換爲本地c字符串(char *)?不幸的是,我找不到有關如何做到這一點的任何文件。我在c代碼中使用以下原型調用java函數。如何將jbyteArray轉換爲jni中的原生char *?

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

在c代碼中,我調用這個函數返回一個字節數組。這個字節數組的內容是一個java字符串。但我需要將其轉換爲C字符串。

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

回答

17

我相信你會用GetByteArrayElementsReleaseByteArrayElements。喜歡的東西:

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

你應該能夠在這一點上,以訪問數組中的數據投bchar*。請注意,這可能會造成數據的副本,所以你要確保釋放使用ReleaseByteArrayElements內存:

ReleaseByteArrayElements(env, arr, b, 0); 

最後一個參數是指示如何b變化應處理的模式。 0表示這些值被複制回arr。如果您不想將數據複製回arr,請改爲使用JNI_ABORT。請參閱JNI Reference

+0

您的鏈接已損壞。請更新。 –

+0

@DRH將1.4.2鏈接更新爲1.5鏈接並沒有太大的改進。 – EJP

+0

小心將null結束。一般來說,文件內容不會以null結尾; C(++)字符串函數可能會窒息。爲了可靠地解決這個問題,你必須將文件字節複製到一個字節大的緩衝區中,並將最終字節設置爲零 –