【问题标题】:How to convert jbyteArray to native char* in jni?如何在 jni 中将 jbyteArray 转换为原生 char*?
【发布时间】:2012-01-16 09:01:36
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: java java-native-interface


    【解决方案1】:

    我相信你会使用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

    【讨论】:

    • @DRH 将 1.4.2 链接更新为 1.5 链接并没有多大改进。
    • 小心将无效终止。通常,文件内容不会以 null 结尾; C(++) 字符串函数可能会因此而窒息。为了可靠地解决这个问题,您必须将文件字节复制到一个大一个字节的缓冲区中,并将最后一个字节设置为零
    • ReleaseByteArrayElements() 即使不涉及复制操作也必须调用
    猜你喜欢
    • 2013-11-11
    • 2019-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多