什么是JNI等效于unsigned char指针?

时间:2013-08-08 20:34:03

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

我在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调用trapdoor函数?

mySource_jni.c:

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

myJavaSource.java:

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

我从其他帖子中发现,java中没有与unsigned数据类型相同的语句(如果我错了,请更正)。

4 个答案:

答案 0 :(得分:3)

Java确实不使用无符号基本类型(除了char(16位)之外),但总是可以使用更大的精度。

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

所以我会首先尝试使用它:

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

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

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

  • int[]您没有提及它存储的数据类型。例如。如果它是加密密钥,则可以将每个int转换为unsigned int。否则请使用long[]

  • byte[]我知道你的函数会在这里存储值,所以这无关紧要。否则,请使用shortint

我希望它有所帮助

答案 1 :(得分:2)

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

然后在该Class文件上调用javah

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


您希望能够包含所有数据。因此,应使用最大的最小变量类型。正如其他人已经注意到的那样(我已经对它们进行了投票),unsigned int需要longunsigned char需要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);

答案 2 :(得分:2)

java short是16位签名。如果要覆盖16位无符号的全部范围,则需要使用int(32位有符号)。

指针可以在32位系统上表示为ints,在32/64位系统上表示为longs。如果您不需要精确指定大小的指针,那么longs就是您想要的指针。

要参考Java原语,请检查here。请注意,与c ++不同,这些大小与系统无关。

答案 3 :(得分:2)

我假设'32 -byte'表示'32-bit',同样表示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