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

Posted

技术标签:

【中文标题】Android jni 数据类型丢失精度(ByteBuffer,int)【英文标题】:Android jni datatype losing precision (ByteBuffer, int) 【发布时间】:2012-04-17 13:37:19 【问题描述】:

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

【问题讨论】:

不太了解 jni 但为什么 +1..4 而不是 +0..3。数组索引是从零开始的,或者在 jni 中有所不同,或者你传递了更多的值?请显示/编写完整的测试代码(本机 + java)。 这是 c 文件。这些不是数组索引。它们是起始指针的相对地址,起始指针指向(在 java 中分配的)内存块。我检查了每个位置(在 c 中)的值都很好。 java 中的字节范围是 -128...127(与 c 中的 (signed) char 相同)。它不能包含 180。 【参考方案1】:

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

【讨论】:

以上是关于Android jni 数据类型丢失精度(ByteBuffer,int)的主要内容,如果未能解决你的问题,请参考以下文章

Android NDK JNI WARNING: illegal start byte 0x

准备位图 byte[] 数据以传递给 jni

JNI从ByteBuffer获取数据,返回byte[]

前端获取Long类型精度丢失解决办法

Android 金额转换精度丢失

go类型转换