摩托罗拉Defy的JNI函数jdouble错误的对齐

时间:2012-10-01 15:03:15

标签: android java-native-interface

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

问题:

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

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

所有变量在java和jdouble中都被定义为C ++文件中的double。 在所有设备上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?)

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

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

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

1 个答案:

答案 0 :(得分: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)

看起来Bitmap-Pointers在参数列表的开头或结尾被区别对待。