私は何をしていますか: 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 を使用しています