Android jni数据类型丢失精度(ByteBuffer,int)

时间:2012-04-17 13:37:19

标签: android java-native-interface bytebuffer

我在做什么: 我在途中在C中添加了四个整数,我丢失了信息。

见下面的代码:

//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代码......

编辑:我在Android 3.2.1测试设备的当前版本中使用eclipse / SDK / NDK

1 个答案:

答案 0 :(得分:0)

正如@Deucalion所说,你的阵列看起来很狡猾。除非您尝试添加数组1,数组[2],数组[3]和数组[4]。不使用数组[0]。
无论如何,假设你所做的就是你想要的,你的价值正是你所得到的 字节范围是-128 t0 +127。因此180实际存储为-76。并voila !!