3

私はCで次のような関数を持っています:

mySource.c:

int trapdoor(unsigned char keywords[][MAX_SIZE], unsigned int *s, int slen, unsigned char *out, int outlen); 

ここで、keywords は char 配列の配列 (異なるサイズのキーワードを含む)、s は長さ slen の unsigned int (編集:実際には 128 ビット => slen の値は 4 になります)、out は宛先ポインターです。関数の結果が格納され、長さは outlen です (編集: 256 ビット => outlen の値は 32 です)。

注: これは暗号化関数であるため、データ型を前述の正確なサイズにする必要がありました。

そして、JNI インターフェイスを使用して Java からこの関数を呼び出す必要があります。Cでtrapdoor関数を呼び出すためにパラメータとして渡す必要があるJavaおよびJNIの同等のデータ型は何ですか?

mySource_jni.c:

JNIEXPORT ?? JNICALL Java_proj_trapdoor(JNIEnv *env, jobject obj, ??,  ??, ??, ??, ??, ??);

myJavaSource.java:

private native ?? trapdoor_extraction(??, ??, ??, ??, ??);

他の投稿から、Java には署名されていないデータ型に相当するものがないことがわかりました (間違っている場合は修正してください)。

4

3 に答える 3

4

charJava が符号なしプリミティブ型 ( 16 ビットを除く) を使用しないことは事実ですが、いつでもより大きな精度を使用できます。

私の提案は、引数が符号付きデータ型であるかどうかに関係なく、Java で意味のあるメソッドを生成し、C メソッド内で符号なしにキャストすることです。

だから私はこれを最初に使用しようとします:

int trapdoor(char[][] keywords, int[] s, byte[] out);

注: を使用して C 側で配列の長さを取得できるため、配列の長さを渡す必要はありませんenv->GetArrayLength()

  • char[][]は署名されていないため、Java 側が 1 文字より大きい値を渡した場合でも、下位バイトのみを使用するため、unsigned char. それ以外の場合は、を使用できますshort

  • int[]保存するデータの種類については言及していません。intたとえば、暗号化用のキーの場合は、それぞれをにキャストしても問題ありませんunsigned int。それ以外の場合は、これに a を使用しlong[]ます。

  • byte[]関数がここに値を格納することを理解していますので、これは問題ではありません。それ以外の場合は、shortまたはを使用しますint

役立つことを願っています

于 2013-08-08T21:18:23.127 に答える
2

Java クラスが最初にネイティブ メソッドを使用して記述し、Java がデータを受信したときに想定されるデータを使用します。

次に、そのクラス ファイルでjavahを呼び出します。

これにより、C++ で使用するヘッダー ファイルとスタブ ファイルが生成され、それを拡張して C++ クラスを設計します。


すべてのデータを含めることができるようにする必要があります。したがって、最大最小の変数型を使用する必要があります。他の人が指摘しているように (私は賛成しましunsigned intlong)unsigned charint

C                                  | JAVA IN C                    | JAVA
unsigned char keywords[][MAX_SIZE] | jobjectArray of jintArrays   | int[][]
unsigned int *s                    | jlong                        | long
int slen                           | jint                         | int
unsigned char *out                 | jint                         | int
int outlen                         | jint                         | int

テストされていないプロトタイプ、穴埋め、Java のものを実行し、javah を使用します。

子:

JNIEXPORT jint JNICALL Java_proj_trapdoor(JNIEnv *env, jobject obj, jobjectArray keywordz,  jlong s, jint slen, jint out, jint outlen);

ジャワ:

private native int trapdoor_extraction(int[][] keywordz, long s, int slen, int out, int outlen);
于 2013-08-08T20:41:51.217 に答える