我在做什么:我在 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