21

unsigned int を jint に変換するにはどうすればよいですか? 変換する必要がありますか、それとも特別な処理をせずに返品できますか? これは基本的に現在の私のコードですが、ローカルで JNI をセットアップしていないため、テストできません。

JNIEXPORT jint JNICALL
Java_test_test(JNIEnv* env, jobject obj, jlong ptr)
{
    MyObject* m = (MyObject*) ptr; 
    unsigned int i = m->get(); 
    return i; 
}
4

3 に答える 3

19

一般に、jintは と同等intであり、 の約半分の値を保持できますunsigned int。変換は静かに行われますが、jint値が負の場合、またはunsigned int値が保持できる最大値よりも大きい場合jint、結果は予期したものとは異なります。

于 2011-11-04T16:28:10.667 に答える
10

jintは typedef でint32_tあるため、通常のキャスト規則がすべて適用されます。

于 2011-11-04T16:26:14.723 に答える
9

コンパイラの設定によっては、符号付き/符号なし整数の混在に関する警告が表示される場合と表示されない場合があります。エラーは発生しません。上記の回答のすべての警告が適用されますunsigned int。0x80000000 (2,147,483,648) 以上の値は、Java 側で負の整数になります。

これらの大きな数値を Java で保持することが不可欠な場合は、jlong代わりに a を戻りデータ型として使用し、次のように変換します。

return (jlong)(unsigned long long)i;

要点は、まず 64 ビットに拡張し、次に unsignedness を捨てることです。逆にすると、64 ビットの負の数が生成されます。

于 2011-11-04T16:39:52.857 に答える