我在做什麼: 我在路上添加了四個整數,我失去了信息。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當前版本中測試設備
不知道jni,但爲什麼+ 1..4而不是+ 0..3。數組索引是基於零的還是jni中的不同,或者你傳遞了更多的值?請顯示/編寫完整的測試代碼(native + java)。 – Deucalion 2012-04-17 21:36:11
這是c文件。這些不是數組索引。它們是起始指針的相對地址,它指向(在java分配的)內存塊。在每個位置(在c)的值是好的,我檢查。 – mojjj 2012-04-18 08:10:58
java中的字節範圍是-128 ... 127(與c中的(signed)char相同)。它不能包含180. – Deucalion 2012-04-18 09:23:43