2011-10-29 77 views
2

我寫了一些代碼,它使用jni在java和c之間傳遞值。哪個JNI數據類型?

目前所有NUMERICS被定義爲int(JAVA) - > jnit(JNI/C) - >無符號整數(C)

代碼工作但它確實是低效的,因爲不是所有的數字是通所​​需要的內存可用於整數。

我有3種在我的代碼值這就需要持有數量範圍爲0至4294967295,0至255和0至1

我不能在所有3「語言」工作了兼容的數據類型。

Range   Java   C/JNI   C 
4294967296  int   jint   unsigned int 
256    ???   ???   unsigned char 
2    boolean  jboolean  ??? 

您能否告訴我需要使用哪些數據類型?

感謝 摹

+0

在某些體系結構(特別是ARM)上使用32位值比使用16/8位體系結構更快。所以除非我們正在討論存儲空間,否則將參數傳遞爲'int' /'jint'可能是一個淨贏。 –

回答

1

記住,沒有無符號的類型Java中。因此,Java int實際上不能存儲C unsigned int的所有值。假設C unsigned int總是32位寬,您也在操作。它可以是不同的大小,雖然這個行業有些標準化。

有了這樣的方式,你在這裏的邏輯下,intjintunsigned intbytejbyteunsigned char,並作爲booleanjboolean_Bool(未充分利用的C99型,可以只持有10數值)

注意,在C char是不一樣的Java中的char。前者代表一個單字節,然而它可能有很多位,而後者代表一個UTF-16字符。還要注意,根據編譯器和平臺,可能會在C中對char進行簽名或未簽名,因此爲了安全起見,如果符號可能很重要,應該明確使用signed char

1

就像在C布爾有一個答案on this site

和範圍的256將在Java字節覆蓋但他們簽名,可以證明易於使用的短褲。本質上,java類型是有符號的,處理這個問題最簡單的方法就是確保映射的類型大於你想要包含的範圍,因此對於範圍爲256和長爲4.2x10^9的域來說, 2,147,483,648和最大值2,147,483,647。

+0

unsigned char * body =(* env) - > GetShortArrayElements(env,myjshortArray,0); 我得到一個「警告:從不兼容的指針類型初始化」 – Beakie