2011-10-29 10 views
2

私はjniを使ってjavaとcの間の値を渡すコードを書いています。現在、すべての数字はint型(Java)のように定義されているどのJNIデータ型ですか?

- > jnit(JNI/C) - > unsigned int型(C)

コード作品ではなく、すべての数字というパスが必要なので、それは本当に非効率的です整数に利用可能なメモリ。

私はすべて3「言語」間で互換性のあるデータ型をうまくすることはできません1.

に255と0に4294967295から0、0の範囲私は数を保持する必要が私のコードの値の3種類があります。

Range   Java   C/JNI   C 
4294967296  int   jint   unsigned int 
256    ???   ???   unsigned char 
2    boolean  jboolean  ??? 

あなたは上記のようにどのデータタイプを使用する必要がありますか?

おかげ G

+0

32ビット値で動作するいくつかのアーキテクチャ(特にARM)では、16/8ビットのものよりも高速です。したがって、私たちが話しているストレージスペースでない限り、 'int' /' jint'としてパラメータを渡すことは、純粋な勝利かもしれません。 –

答えて

1

は、Javaには符号なしの型が存在しない、覚えておいてください。したがって、Java intは実際にはC unsigned intのすべての値を格納することはできません。また、C unsigned intは常に32ビット幅であるという前提で動作しています。業界はやや標準化していますが、それは異なるサイズにすることができます。あなたがここにあるロジック次

の方法のうちそれと

intjintにあるがbyteとしてunsigned intにあるjbyteにあるunsigned charにあり、かつbooleanとしてjbooleanにあること_Boolすることができます(利用されていないC99型にあります唯一の値として1又は0を保持する)

注Cにcharは、Javaでcharと同じではないこと。前者は1バイトを表すが、後者はUTF-16文字を表すが、それは多くのビット幅である可能性がある。また、charは、コンパイラとプラットフォームによってはC言語で署名されても署名されなくてもかまいませんので、安全であるように記号が重要な場合はsigned charを明示的に使用する必要があります。 Cのbooleanについては

1

は答えon this site

と256の範囲、Javaでのバイトでカバーされるだろうが、彼らはそれがショートパンツを使用する単純な証明することができるように、署名されています。基本的にはJava型が署名されており、それを処理する最も簡単な方法は、マッピングの型が、範囲を256より大きく、int型のカバーとして4.2x10^9であることを確認することです。 2,147,483,648であり、最大値は2,147,483,647である。

+0

符号なしchar * body =(* env) - > GetShortArrayElements(env、myjshortArray、0); "警告:互換性のないポインタ型からの初期化" – Beakie