2012-04-17 54 views
0

我在做什麼: 我在路上添加了四個整數,我失去了信息。Android jni數據類型丟失精度(ByteBuffer,int)

下面

見代碼:

//c-file 
jbyte *inputByteArray = (*env)->GetDirectBufferAddress (env, obj); 

// checked every value, also sizeof(val1)= 4 etc... 
int val1 = (int) *(inputByteArray + 1); //120 
int val2 = (int) *(inputByteArray + 2); //120 
int val3 = (int) *(inputByteArray + 3); //180 
int val4 = (int) *(inputByteArray + 4); //180 
int result = val1 + val2 + val3 + val4; 

return result; 
//return type is int 

//output: 88, should be 600 
// 88 binary: 0000 0000 0101 1000 
//600 binary: 0000 0010 0101 1000 

關於這個特殊的事情是下面的,這可能是造成問題的原因:

對輸入的4個值來自移交的緩衝區從Java ,這是一個直接的ByteBuffer。它是直接在Java中分配的,爲了不被垃圾收集器移動。在c端,我通過來自「GetDirectBufferAddress」(參見代碼)的指針遞交緩衝區,單個值確實匹配數組中的值。

有沒有人知道這種奇怪的行爲?

當我使用IntBuffer交出數字時,它的工作方式。
我在這裏工作的性能,所以我想小緩衝區和我的數據值足夠小,以使用ByteBuffer。 (這只是在C代碼方面更大的計算的片段)

由於這是在Android上,我沒能調試到C代碼...

編輯:我使用eclipse/SDK/NDK在Android 3.2.1當前版本中測試設備

+0

不知道jni,但爲什麼+ 1..4而不是+ 0..3。數組索引是基於零的還是jni中的不同,或者你傳遞了更多的值?請顯示/編寫完整的測試代碼(native + java)。 – Deucalion 2012-04-17 21:36:11

+0

這是c文件。這些不是數組索引。它們是起始指針的相對地址,它指向(在java分配的)內存塊。在每個位置(在c)的值是好的,我檢查。 – mojjj 2012-04-18 08:10:58

+0

java中的字節範圍是-128 ... 127(與c中的(signed)char相同)。它不能包含180. – Deucalion 2012-04-18 09:23:43

回答

0

由於@Deucalion說你的數組看起來不太好用。除非您正在嘗試添加數組1,array [2],array [3]和array [4]。不使用數組[0]。
無論如何,假設你所做的就是你的意圖,你的價值正是你將得到的。
字節範圍是-128 t0 +127。所以180實際上被存儲爲-76。和voila !!

+0

thx大家給你幫忙! – mojjj 2012-04-25 05:53:53