0

在某些设备上,我遇到双值未正确传输到 C++ 的问题。看起来双精度值的第一部分被复制到目标变量的后半部分,而后半部分复制到下一个目标变量的前半部分。

问题:

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

感兴趣的读者的更多细节:

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

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

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

当调用摩托罗拉 Defy 时,我得到了奇怪的结果。我用 3 个 jdouble 变量调用一个函数。第一次 (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?)

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

在问题设备(摩托罗拉 Defy)上,“预期”值是相同的,因此 Java 部分似乎工作正常,但 JNI 代码中的“找到”值完全不同。我在这里没有真正看到模式,相同的输入导致不同的输出,并且字节甚至不接近“预期”中的字节。

第一印象是,这些值永远不会设置,它使用该内存位置的任何内容?可能是什么原因以及如何解决它的任何想法?

4

1 回答 1

0

通过更改参数的顺序来修复

(JNIEnv *env, jclass thiz, jobject bitmap1, jobject bitmap2, jdouble x1, jdouble y1, jdouble x2, jdouble y2)

(JNIEnv *env, jclass thiz, jdouble x1, jdouble y1, jdouble x2, jdouble y2, jobject bitmap1, jobject bitmap2)

看起来位图指针在参数列表的开头或结尾处被不同地对待。

于 2014-02-10T21:01:29.940 回答