私は何をしていますか: 途中で4つの整数を追加します。情報が失われます。Android jniデータ型精度を失う(ByteBuffer、int)
、以下を参照してくださいコード:
//c-file
jbyte *inputByteArray = (*env)->GetDirectBufferAddress (env, obj);
// checked every value, also sizeof(val1)= 4 etc...
int val1 = (int) *(inputByteArray + 1); //120
int val2 = (int) *(inputByteArray + 2); //120
int val3 = (int) *(inputByteArray + 3); //180
int val4 = (int) *(inputByteArray + 4); //180
int result = val1 + val2 + val3 + val4;
return result;
//return type is int
//output: 88, should be 600
// 88 binary: 0000 0000 0101 1000
//600 binary: 0000 0010 0101 1000
このことについて特別なことが問題を引き起こしている可能性があり、以下、次のとおりです。
入力のための4つの値は、Javaから利きオーバーバッファからですこれはダイレクトByteBufferです。ガベージコレクタによって移動されないように、Javaで直接割り当てられます。 c側では、 "GetDirectBufferAddress"(コードを参照)のポインタ経由でバッファを渡し、単一の値は配列内の値と一致します。
誰もこの奇妙な行動について知っていますか?
IntBufferを使用して数値を渡すと、途中で動作します。
ここでパフォーマンス上の作業を行っているので、小さなバッファが必要になり、データ値がByteBufferを使用するのに十分小さいです。私が使用しています:
編集...これは、Android上にあるので、私はCコードにデバッグするために管理していなかった
(これはCコード側の大きな計算の断片のみです) Android 3.2.1テストデバイスの現在のバージョンのeclipse/SDK/NDK
jniがよく分かりませんが、+ 0..3の代わりに+ 1..4が必要です。配列インデックスはゼロベースであるか、またはjniで何か違うか、より多くの値を渡しますか?完全なテストコードを表示してください(native + java)。 – Deucalion
これはcファイルです。これらは配列インデックスではありません。それらは、(Javaで割り当てられた)メモリブロックを指す開始ポインタに対する相対アドレスです。各位置の値(c)はきれいです。 – mojjj
Javaのバイト範囲は-128〜127です(cの(符号付き)charと同じです)。それは180を含めることはできません。 – Deucalion