首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么是JNI等价于一个无符号字符指针?

什么是JNI等价于一个无符号字符指针?
EN

Stack Overflow用户
提问于 2013-08-08 20:34:02
回答 3查看 6.7K关注 0票数 3

我在C中有一个函数:

mySource.c:

代码语言:javascript
复制
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:

代码语言:javascript
复制
JNIEXPORT ?? JNICALL Java_proj_trapdoor(JNIEnv *env, jobject obj, ??,  ??, ??, ??, ??, ??);

myJavaSource.java:

代码语言:javascript
复制
private native ?? trapdoor_extraction(??, ??, ??, ??, ??);

我从其他文章中发现,在java中没有等同于无符号数据类型(如果我错了,请纠正我)。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-08-08 21:18:23

的确,Java不使用无符号基元类型( char除外,它是16位),但是您始终可以使用更高的精度。

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

所以我试着先用这个:

代码语言:javascript
复制
int trapdoor(char[][] keywords, int[] s, byte[] out);

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

  • char[][]是无符号的,所以即使Java传递大于单个字符的值,您也只能使用较低的字节,因此将其视为unsigned char。否则,您可以使用short
  • int[] --您没有提到它存储的数据类型。如果它是用于加密的密钥,则可以将每个int转换为unsigned int。否则,请使用long[]
  • byte[]我知道您的函数将在这里存储这些值,所以这不重要。否则使用shortint

我希望它能帮上忙

票数 4
EN

Stack Overflow用户

发布于 2013-08-08 20:41:51

首先使用本机方法编写Java类,在Java接收到数据时使用您期望的数据。

然后调用该类文件上的爪哇

这将生成头文件和存根文件,以便在C++中使用,然后扩展这些文件以设计C++类。

您希望能够包含所有数据。因此,应该使用最大的最小变量类型。正如其他人所注意到的(我对他们投了反对票),unsigned int需要一个longunsigned char需要一个int,所以它按如下方式分解:

代码语言:javascript
复制
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:

代码语言:javascript
复制
JNIEXPORT jint JNICALL Java_proj_trapdoor(JNIEnv *env, jobject obj, jobjectArray keywordz,  jlong s, jint slen, jint out, jint outlen);

爪哇:

代码语言:javascript
复制
private native int trapdoor_extraction(int[][] keywordz, long s, int slen, int out, int outlen);
票数 2
EN

Stack Overflow用户

发布于 2013-08-08 20:43:01

我假设“32字节”指的是‘32位’,16也是这样,因为一个32字节的数字实际上是一个256位的数字。

以下是每个Java整数的位计数:

代码语言:javascript
复制
byte  ->  8-bit
short ->  16-bit
char  ->  16-bit
int   ->  32-bit
long  ->  64-bit

因此,我相信Java的等价物是:

代码语言:javascript
复制
char[][] keywords, int s, short slen, char out, int outlen
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18135586

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档