1

これは奇妙に聞こえるかもしれませんが、私は過去2日間このバグに苦しんでいます。

  1. ブールジェネレータ booleanを使用して初期化されたJavaの配列があります。Random

  2. その後、boolean配列はCの関数(JNIを使​​用して呼び出されます)によって処理され、変更されたboolean配列はjavaに返されます。配列をCに渡すbooleanと、unsigned charに変換されjbooleanArray、Javaに戻される前にに変換されます。

  3. ここで、次のコードを実行します(iにはforループがあります)。

    if(chosen_packet[i] == false)
    {
         pkt.first[i] = 0;
         System.out.print(chosen_packet[i]);
    }
    if(chosen_packet[i] == true)
    {
         pkt.first[i] = 1;
         System.out.print(chosen_packet[i]);
    }
    

問題は、それでも2番目の条件に入らない場合chosen_packet[i]があることです。これは時々起こり、時々コードはうまく機能します。このような場合に印刷すると、まだ印刷されており、2番目の条件にはなりません。このように見えるアレイの破損の考えられる理由は何でしょうか?trueifchosen_packet[i]trueifboolean

編集:これは私がCでboolean配列を変換する方法です:unsigned char

 jboolean *element = (*env)->GetBooleanArrayElements(env,chosen_packet,0);
 for(j = 0; j < sz; j++)
          src_pkt[j] = (unsigned char)element[j];

このsrc_pktが実行されてから、に変換し直しjbooleanます。

EDIT2:これは私がunsignedchar配列をjbooleanに戻す方法です:

 jbooleanArray arr = (*env)->NewBooleanArray(env,sz);
 (*env)->SetBooleanArrayRegion(env,arr,0,sz,src_pkts);
 (*env)->DeleteLocalRef(env,arr);
4

2 に答える 2

1

それがその状態にあることをチェックしているので、それが最初に入力されないのbooleanは正常です。trueiffalse

コードは次のように簡略化できます(if/else異なる条件をチェックする場合は、2つではなく使用する必要があります)。

if (chosen_packet[i]) {
    pkt.first[i] = 1;
} else {
    pkt.first[i] = 0;
}
System.out.print(chosen_packet[i]);

あるいは

pkt.first[i] = chosen_packet[i] ? 1 : 0;
System.out.print(chosen_packet[i]);

編集

プログラムが2番目のifを入力しない場合、つまり変数chosen_packet[i]がではないtrue場合は、デバッガーを使用して実際の値を確認できます。

fredcrsが述べたように、それchosen_packet[i]がタイプであると確信していますbooleanか?

于 2012-11-29T18:37:36.993 に答える
1

Javabooleanは通常、シングルバイトとして実装されます。そのため、Cコードにバグがあり、がまたはにならない可能性がありbooleanます。その場合、未定義の動作が発生する可能性があります。truefalse

as inにキャストunsigned charするだけでは、正規化されないことに注意してください。を使用する必要があります。jboolean(jboolean) src_pkt[j]src_pkt[j] ? JNI_TRUE : JNI_FALSE

それでも、JNIコードの関連部分をもっと投稿する必要があると思います。

于 2012-11-29T18:44:37.887 に答える