我在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数据类型相同的语句(如果我错了,请更正)。
答案 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[]
我知道你的函数会在这里存储值,所以这无关紧要。否则,请使用short
或int
我希望它有所帮助
答案 1 :(得分:2)
首先使用本机方法编写Java类,使用Java收到数据时所期望的任何数据。
然后在该Class文件上调用javah。
这将生成用于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);
答案 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