0

私は何をしていますか: C で 4 つの整数を追加します。途中で、情報を失います。

以下のコードを参照してください。

//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 つの値は、直接 ByteBuffer である Java から渡された Buffer からのものです。ガベージコレクターによって移動されないように、Java で直接割り当てられます。c 側では、"GetDirectBufferAddress" からのポインターを介してバッファーを渡します (コードを参照)。単一の値は配列内の値と一致します。

この奇妙な行動について知っている人はいますか?

ちなみに、IntBufferを使用して数値を渡すと、うまくいきます。
私はここでパフォーマンスに取り組んでいるので、小さなバッファーが必要であり、データ値は ByteBuffer を使用するのに十分小さいです。(これは、C コード側のより大きな計算の一部にすぎません)

これはAndroid上にあるため、Cコードにデバッグできませんでした...

編集: Android 3.2.1 テスト デバイスの現在のバージョンで eclipse/SDK/NDK を使用しています

4

1 に答える 1

0

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

于 2012-04-19T05:38:33.250 に答える