我在C中有一个函数:
mySource.c:
int trapdoor(unsigned char keywords[][MAX_SIZE], unsigned int *s, int slen, unsigned char *out, int outlen); 其中关键字是一个字符数组(包含不同大小的关键字),s是一个长度无符号的整数(编辑:实际上是128-bit=>所以slen的值是4),out是存储函数结果和长度输出的目标指针(编辑: 256-bit=>so值为32)。
注意:由于这是一个加密函数,所以我需要数据类型具有我提到的确切大小。
我必须使用JNI接口从java调用这个函数。现在,在java & JNI中,我必须作为参数传递哪些等效的数据类型来调用C?中的trap闭门函数?
mySource_jni.c:
JNIEXPORT ?? JNICALL Java_proj_trapdoor(JNIEnv *env, jobject obj, ??, ??, ??, ??, ??, ??);myJavaSource.java:
private native ?? trapdoor_extraction(??, ??, ??, ??, ??);我从其他文章中发现,在java中没有等同于无符号数据类型(如果我错了,请纠正我)。
发布于 2013-08-08 21:18:23
的确,Java不使用无符号基元类型( char除外,它是16位),但是您始终可以使用更高的精度。
我的建议是生成一个在Java中有意义的方法,不管参数是有符号的数据类型,并将它们转换为C方法中的无符号。
所以我试着先用这个:
int trapdoor(char[][] keywords, int[] s, byte[] out);注意:您不需要传递数组长度,因为您可以使用env->GetArrayLength()在C端获得数组的长度。
char[][]是无符号的,所以即使Java传递大于单个字符的值,您也只能使用较低的字节,因此将其视为unsigned char。否则,您可以使用short。int[] --您没有提到它存储的数据类型。如果它是用于加密的密钥,则可以将每个int转换为unsigned int。否则,请使用long[]。byte[]我知道您的函数将在这里存储这些值,所以这不重要。否则使用short或int我希望它能帮上忙
发布于 2013-08-08 20:41:51
首先使用本机方法编写Java类,在Java接收到数据时使用您期望的数据。
然后调用该类文件上的爪哇。
这将生成头文件和存根文件,以便在C++中使用,然后扩展这些文件以设计C++类。
您希望能够包含所有数据。因此,应该使用最大的最小变量类型。正如其他人所注意到的(我对他们投了反对票),unsigned int需要一个long,unsigned 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);发布于 2013-08-08 20:43:01
我假设“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 outlenhttps://stackoverflow.com/questions/18135586
复制相似问题