2012-04-17 10 views
0

私は何をしていますか: 途中で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

+0

jniがよく分かりませんが、+ 0..3の代わりに+ 1..4が必要です。配列インデックスはゼロベースであるか、またはjniで何か違うか、より多くの値を渡しますか?完全なテストコードを表示してください(native + java)。 – Deucalion

+0

これはcファイルです。これらは配列インデックスではありません。それらは、(Javaで割り当てられた)メモリブロックを指す開始ポインタに対する相対アドレスです。各位置の値(c)はきれいです。 – mojjj

+0

Javaのバイト範囲は-128〜127です(cの(符号付き)charと同じです)。それは180を含めることはできません。 – Deucalion

答えて

0

@Deucalionによると、あなたの配列はダッジに見えます。配列1、配列[2]、配列[3]および配列[4]を追加しようとしている場合を除きます。配列[0]を使用しないでください。
とにかく、あなたがやったことがあなたの意図であると仮定すると、あなたの価値はまさにあなたが得るものです。
バイト範囲は-128 t0 +127です。したがって、180は実際に-76として格納されます。そしてvoila !!

+0

あなたのために誰もが助けて! – mojjj

関連する問題