0

我在做什么:我在 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 的一个移交的 Buffer,它是一个直接的 ByteBuffer。它直接在 Java 中分配,以便不被垃圾收集器移动。在 c 端,我通过来自“GetDirectBufferAddress”的指针(参见代码)移交缓冲区,并且单个值确实与数组中的值匹配。

有谁知道这种奇怪的行为?

当我使用 IntBuffer 交出数字时,顺便说一句。
我在这里工作是为了提高性能,所以我想要小的缓冲区,而且我的数据值小到可以使用 ByteBuffer。(这只是 c 代码端更大计算的一个片段)

由于这是在Android上,我没有设法调试到c代码......

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

4

1 回答 1

0

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

于 2012-04-19T05:38:33.250 回答