3

我在 C 中有一个函数:

mySource.c:

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

其中关键字是 char 数组的数组(具有不同大小的关键字), s 是长度为 slen 的无符号整数(编辑:实际上 128 位 => 所以 slen 的值将是 4)并且 out 是目标指针,其中函数的结果被存储并且长度为outlen(编辑: 256位=>所以outlen的值为32)。

注意:由于这是一个加密函数,我需要数据类型与我提到的大小完全相同。

我必须使用 JNI 接口从 java 调用这个函数。现在,我必须将 java 和 JNI 中的等效数据类型作为参数传递以调用 C 中的陷门函数吗?

mySource_jni.c:

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

myJavaSource.java:

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

我从其他帖子中发现,Java 中没有与无符号数据类型等效的内容(如果我错了,请纠正我)。

4

3 回答 3

4

确实,Java 不使用无符号原始类型(char16 位除外),但您始终可以使用更高的精度。

我的建议是生成一个在 Java 中有意义的方法,无论参数是否是有符号数据类型,并将它们转换为 C 方法中的无符号。

所以我会先尝试使用它:

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

注意:您不需要传递数组长度,因为您可以在 C 端使用env->GetArrayLength().

  • char[][]是无符号的,因此即使 Java 端传递的值大于单个字符,您也只会使用较低的字节,因此您会将其视为unsigned char. 否则你可以使用short.

  • int[]你没有提到它存储什么类型的数据。例如,如果它是加密密钥,则可以将每个密钥转换intunsigned int. 否则使用 a long[]

  • byte[]我知道您的函数会将值存储在这里,所以这无关紧要。否则使用 ashort或 anint

我希望它有帮助

于 2013-08-08T21:18:23.127 回答
2

我假设“32 字节”是指“32 位”,16 也是如此。原因是,因为 32 字节的数字实际上是 256 位的数字。

这些是每个 Java 整数的位数:

byte  ->  8-bit
short ->  16-bit
char  ->  16-bit
int   ->  32-bit
long  ->  64-bit

由此,我相信 Java 等价物是:

char[][] keywords, int s, short slen, char out, int outlen
于 2013-08-08T20:43:01.547 回答
2

首先使用本机方法编写您的 Java 类,使用 Java 接收数据时您期望的任何数据。

然后在该类文件上调用javah 。

这将生成用于 C++ 的头文件和存根文件,然后您将其扩展以设计您的 C++ 类。


您希望能够包含所有数据。因此,应该使用最大最小的变量类型。正如其他人所指出的(我已经对他们投了赞成票),unsigned intrequires alongunsigned charrequires an int,所以它分解如下:

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:

C:

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 回答