一部のデバイスでは、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 コード内の「見つかった」値は完全に異なります。ここにはパターンが実際にはありません。同じ入力が異なる出力につながり、バイトは「期待される」ものに近くさえありません。
第一印象は、値が設定されず、そのメモリ位置にあるものは何でも使用するということですか? 何が原因で、それを修正する方法はありますか?