gpt4 book ai didi

java-native-interface - 将 jbyteArray 转换为字符数组,然后打印到控制台

转载 作者:行者123 更新时间:2023-12-04 08:37:46 27 4
gpt4 key购买 nike

我正在编写一个 JNI 程序,其中我的 .cpp 文件获取一个 jbyteArray,我希望能够使用 printf 打印 jbyteArray。为此,我相信我必须将 jbyteArray 转换为字符数组。

对于背景知识,我的 JNI 的 java 端将 String 转换为 byteArray,然后将该 byteArray 作为参数传递给我的 JNI 函数。

到目前为止我所做的可以正确打印出字符串,但后面是垃圾字符,我不知道如何摆脱这些/如果我做错了什么。

这是字符串的内容:

dsa

以及打印到控制台的内容:
dsa,�

垃圾字符会根据字符串的内容而变化。
这是相关的代码部分:

.java 文件:
public class tcr extends javax.swing.JFrame{

static{
System.loadLibrary("tcr");
}

public native int print(byte file1[]);

.....

String filex1 = data1TextField.getText();//gets a filepath in the form of a String from a GUI jtextfield.
byte file1[]= filex1.getBytes();//convert file path from string to byte array

tcr t = new tcr();
t.print(file1);
}

.cpp 代码:
JNIEXPORT jint JNICALL Java_tcr_print(JNIIEnv *env, jobject thisobj, jbyteArray file1){

jboolean isCopy;
jbyte* a = env->GetByteArrayElements(file1,&isCopy);
char* b;
b = (char*)a;
printf("%s\n",b);
}

任何帮助,将不胜感激。

最佳答案

看看你在做什么:

jbyte* a = env->GetByteArrayElements(file1,&isCopy);
a现在指向存储字符串字节内容的内存地址。假设该文件包含字符串“Hello world”。在 UTF-8 编码中,这将是:
48 65 6c 6c 6f 20 77 6f 72 6c 64
char* b = (char*)a;
b现在指向那个内存区域。它是一个 char 指针,因此您可能希望将其用作 C 字符串。但是,这行不通。 C 字符串被定义为一些字节,以零字节结尾。现在向上看,你会看到这个字符串的末尾没有零字节。
printf("%s\n",b);

这里是。您将 char 指针传递给 printf%s告诉 printf这是一个C字符串。但是,它不是 C 字符串,而是 printf仍然尝试打印所有字符,直到它达到零字节。所以你在 dsa 之后看到的实际上是字节数组结束后内存中的字节,直到(巧合)零字节。您可以通过将字节复制到比字节数组长一个字节的缓冲区,然后将最后一个元素设置为零来解决此问题。

更新:

您可以创建更大的缓冲区并附加空字节,如下所示:
int textLength = strlen((const char*)a);
char* b = malloc(textLength + 1);
memcpy(b, a, textLength);
b[textLength] = '\0';

现在 b是一个有效的以 null 结尾的 C 字符串。另外,不要忘记调用 ReleaseByteArrayElements .您可以在 memcpy 之后立即执行此操作称呼。

关于java-native-interface - 将 jbyteArray 转换为字符数组,然后打印到控制台,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17491752/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com