java - JNI 中 unsigned char 指针的等价物是什么?

标签 java c pointers java-native-interface type-conversion

我在 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[] 我知道您的函数会在此处存储值,因此这无关紧要。否则使用 shortint

希望对你有帮助

关于java - JNI 中 unsigned char 指针的等价物是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18135586/

相关文章:

java - 使用 GWT 查看文件是否被修改

java - 相当于C 中java 的scanner.nextline() 吗?

java - 使用 FileItemStream 在 Java 中处理二进制文件

c - 二叉树删除-看不懂一些指针

c - 识别DMA内存在/proc/mtrr和/proc/iomem中?

c - 我如何使指针工作?

c++ - int [] 和 int* 作为函数参数的区别

java - 如何用Java编写IF-ELSE语句

c - PolicyKit-gnome 的以下部分是什么意思?

c - C语言中malloc的使用