2011-10-06 83 views
3

我有一個本地函數,我正在通過JNI訪問,需要將數組的內容返回給java。我的函數原型如下:如何在JNI中返回數組?

JNIEXPORT jcharArray JNICALL Java_jniusb_Main_receiveData 
    (JNIEnv *, jclass, jchar); 

它是用javah.exe生成的。

所以在函數的代碼中,我有一個數組''unsigned char InputPacketBuffer [65]',我想返回到java。但是,我有問題映射到我的返回類型'jcharArray'。

在另一個函數中,我使用JNI提供的'GetCharArrayRegion'方法將'jcharArray'類型的輸入參數轉換爲'jchar'數組,然後將其轉換爲'unsigned char'數組。基本上,我需要做與此相反的轉換,但我無法在JNI規範pdf中找到合適的JNI方法。有人知道怎麼做嗎?

UPDATE:

我發現安迪的鏈接正確的JNI功能 - SetCharArrayRegion()。 「Java本地接口 - 程序員指南和規範」給出了使用其功能的不正確示例。

(*env)->SetCharArrayRegion(env, elemArr, 0, len, chars); 

不編譯。相反,正確的語法是:

(*env).SetCharArrayRegion(elemArr, 0, len, chars); 
+0

這些示例對於C代碼是正確的,其中JNIEnv的typedef是JNI函數指針的結構。對於C++方法調用,只需省略已記錄的JNI函數的第一個參數即可。 –

回答

4

JNI documentation on array operations。與GetCharArrayRegion對應的是SetCharArrayRegion

jchar是一個短的,而不是字符。 Java支持Unicode字符。如果你想要一個字節數組,你可以使用jbytearray。

另一種方法是使用JNI string operations

+0

所有這些數組都是64字節(無符號8位),因此它們需要在vC++中爲'unsigned char'。 jchar是我能夠在JNI中映射到的最接近的東西 - 即使它是無符號的16位,但我可以成功將它轉換爲'unsigned char',因爲我確信java方面永遠不會超出界限。我不能使用Jbyte類型,因爲它是8位有符號的,並且沒有我需要的範圍。 – Ben

+0

你提到鑄造數組 - 這是行不通的。投射個人角色會有效;你也可以使用字節並在Java端進行轉換。 [編輯回答與你在最後一段中提到的具體方法的對應] –

+0

是的,我知道,我的意思是運行一個'for'循環,每個元素都被恰當地指定。無論如何,當使用'getarrayregion'時,你是否必須調用'release array'函數 - 或者它只適用於'getarrayelements'? – Ben