java - 如何在 jni 中将 jbyteArray 转换为原生 char*?

标签 java java-native-interface

我正在尝试将 jbyteArray 转换为 jni 中的原生 C 字符串 (char*)?不幸的是,我找不到任何关于如何做到这一点的文档。我在 C 代码中使用以下原型(prototype)调用 Java 函数。

public static byte[] processFile(byte[] p_fileContent)

在 C 代码中,我调用了这个返回字节数组的函数。这个字节数组的内容是一个java字符串。但我需要将其转换为 C 字符串。

jbyteArray arr = (jbyteArray) env->CallObjectMethod(clsH, midMain, jb);
printf("%s\n", (char*) arr);

最佳答案

我相信您会使用 GetByteArrayElementsReleaseByteArrayElements。像这样的东西:

boolean isCopy;
jbyte* b = GetByteArrayElements(env, arr, &isCopy);

此时您应该能够将 b 转换为 char* 以便访问数组中的数据。请注意,这可能会创建数据副本,因此您需要确保使用 ReleaseByteArrayElements 释放内存:

ReleaseByteArrayElements(env, arr, b, 0);

最后一个参数是一个模式,指示应如何处理对 b 的更改。 0 表示值被复制回 arr。如果您不想将数据复制回 arr,请改用 JNI_ABORT

有关详细信息,请参阅 JNI Reference .

关于java - 如何在 jni 中将 jbyteArray 转换为原生 char*?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8439233/

相关文章:

java - 如何将 tradefed FileUtil 依赖项添加到 Android 应用程序中?

java - 尝试查找元素时如何使用列表上的流抛出异常?

c++ - 我可以将 JNI header 实现与普通 C++ 类混合使用吗?

java - JNI 错误 : attempt to pass an instance of java. lang.String 作为参数

android - 使用大图时如何使用JNI位图操作避免OOM?

java - Android junit : Method scheme in android.net.Uri&Builder 未模拟

java - 在Spring的Service层注入(inject)一个数据存储库

java - 允许指定列名会导致潜在的 SQL 注入(inject)风险

c - 有限状态机/Android NDK JNI

android - 如何在 Android NDK 中比较两个 jbyte 数组