我在 C 中有一个函数:
我的来源.c:
int trapdoor(unsigned char keywords[][MAX_SIZE], unsigned int *s, int slen, unsigned char *out, int outlen);
其中 keywords 是一个 char 数组的数组(具有不同大小的关键字),s 是一个长度为 slen 的无符号整数(编辑: 实际上是 128 位=>所以 slen 的值将是4) out是存储函数结果的目标指针,长度为outlen(EDIT: 256-bit=>所以outlen的值为32)。
注意:因为这是一个加密函数,所以我需要数据类型与我提到的大小完全相同。
而且我必须使用 JNI 接口(interface)从 java 调用此函数。 现在在 java 和 JNI 中我必须传递哪些等效数据类型作为参数来调用 C 中的陷门函数?
mySource_jni.c:
JNIEXPORT ?? JNICALL Java_proj_trapdoor(JNIEnv *env, jobject obj, ??, ??, ??, ??, ??, ??);
我的JavaSource.java:
private native ?? trapdoor_extraction(??, ??, ??, ??, ??);
我从其他帖子中发现,在 Java 中没有等同于无符号数据类型(如果我错了请纠正我)。
最佳答案
Java 确实不使用无符号原始类型(char
除外,它是 16 位的),但您始终可以使用更大的精度。
我的建议是生成一个在 Java 中有意义的方法,无论参数是否是有符号数据类型,并在您的 C 方法中将它们转换为无符号。
所以我会先尝试使用它:
int trapdoor(char[][] keywords, int[] s, byte[] out);
注意:您不需要传递数组长度,因为您可以使用 env->GetArrayLength()
在 C 端获取数组的长度。
char[][]
是无符号的,因此即使 Java 端传递的值大于单个字符,您也只会使用较低的字节,因此您会将其视为unsigned字符
。否则,您可以使用short
。int[]
你没有提到它存储的是什么类型的数据。例如。如果它是加密 key ,则可以将每个int
转换为unsigned int
。否则为此使用long[]
。byte[]
我知道您的函数会在此处存储值,因此这无关紧要。否则使用short
或int
希望对你有帮助
关于java - JNI 中 unsigned char 指针的等价物是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18135586/