0

一部のデバイスでは、double 値が C++ に正しく転送されないという問題が発生します。double 値の最初の部分がターゲット変数の後半にコピーされ、後半が次のターゲット変数の前半にコピーされるようです。

質問:

JNI 関数パラメーターの配置を変更するにはどうすればよいですか?

興味のある読者のための詳細:

すべての変数は、java では double として定義され、C++ ファイルでは jdouble として定義されます。すべてのデバイスで、ByteOrder.nativeOrder() は LITTLE_ENDIAN を報告します。

通常のデバイスでは、予想される 16 進文字列を逆の順序で取得します。

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

Motorola Defy を呼び出すと、奇妙な結果が得られます。3 つの jdouble 変数を使用して関数を呼び出します。最初の実行 (1A-1C) と 2 番目の実行 (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?)

「予想される」16進文字列については、JavaでLong.toHexString(Double.doubleToRawLongBits(dV))を使用し、Robertのリンクで計算されたのと同じ結果が得られます。

問題のデバイス (Motorola 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)

Bitmap-Pointers は、パラメーター リストの先頭または末尾で異なるように扱われるようです。

于 2014-02-10T21:01:29.940 に答える