摩托罗拉Defy上JNI功能的jdouble对齐错误



在一些设备上,我遇到了无法将双值正确传输到C++的问题。看起来双值的第一部分复制到目标变量的后半部分,后半部分复制到下一个目标变量的前半部分。

问题:

如何更改JNI函数参数的对齐方式?

感兴趣的读者的更多详细信息:

所有变量在java中定义为double,在C++文件中定义为jdouble。在所有设备上,ByteOrder.natureOrder()报告LITTLE_ENDIAN。

在普通设备上,我以相反的顺序获得预期的十六进制字符串:

1A: 2.25   -> expected: 4002000000000000, found: 0000000000000240 (works)

当我在摩托罗拉Defy上打电话时,我得到了奇怪的结果。我用3个双变量调用一个函数。第一次(1A-1C)和第二次运行(2A-2C)如下所示:

1A: 2.25   -> expected: 4002000000000000, found: 005c814000000000
1B: 0.1275 -> expected: 3fc051eb851eb852, found: 0000024052B81E85 (second half of 1B?)
1C: 2.25   -> expected: 4002000000000000, found: EB51C03F00000000 (first half of 1B?)
2A: 5.25   -> expected: 4015000000000000, found: 005C814000000000
2B: 0.3045 -> expected: 3fd37ced916872b1, found: 00001530B1726891 (second half of 2B?)
2C: 5.25   -> expected: 4015000000000000, found: ED7CD33F00000000 (first half of 32?)

对于"expected"十六进制字符串,我在Java中使用Long.toHexString(Double.boubleToRawLongBits(dV)),给出了与Robert链接计算的结果相同的结果。

在有问题的设备(Motorola Defy)上,"预期"值是相同的,因此Java部分似乎工作得很好,但JNI代码中的"发现"值完全不同。我在这里并没有看到真正的模式,相同的输入导致不同的输出,字节甚至不接近"预期"中的字节。

第一印象是,这些值永远不会被设置,它会使用那个内存位置的任何东西?原因是什么?有什么解决办法吗?

通过更改的参数顺序进行修复

(JNIEnv*env,jclass thiz,jobject bitmap 1,jobobject bitmap 2,jddouble x1,jddoubley1,jdouble x2,jdoubley2)

(JNIEnv*env,jclass thiz,jddouble x1,jddoubley1,jdouble x2,jdoubley2,jobject位图1,jobobject位图2)

看起来位图指针在参数列表的开头或结尾处的处理方式不同。

最新更新