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;
}
一般的なケースでは、jint
はint
と同等であり、unsigned int
の値の約半分を保持できます。変換はサイレントに機能しますが、jint
値が負の場合、またはunsigned int
値がjint
が保持できる最大値より大きい場合、結果は意図したとおりではありません期待しています。
jint
はint32_t
のtypedefなので、通常のすべてのキャストルールが適用されます。
コンパイラの設定に応じて、符号付き/符号なし整数の混合に関する警告がある場合とない場合があります。エラーはありません。上記の回答からのすべての警告が適用されます-unsigned int
0x80000000(2,147,483,648)以上の値は、Java側で負の整数になります。
これらの大きな数値をJavaで保持することが不可欠な場合は、代わりにjlong
を戻りデータ型として使用し、次のように変換します。
return (jlong)(unsigned long long)i;
ポイントは、最初に64ビットに拡張し、次に符号なしをキャストすることです。逆にすると、64ビットの負の数が生成されます。