java - JNI Stream 二进制数据从 C++ 到 Java

标签 java c++ java-native-interface

我需要帮助将二进制数据传递到 Java。我正在尝试使用 jbytearray,但是当数据进入 Java 时,它似乎已损坏。有人可以帮帮我吗?

这是一些示例代码的片段。首先是 native C++ 端:

printf("Building audio array copy\n");
jbyteArray rawAudioCopy = env->NewByteArray(10);
jbyte toCopy[10];
printf("Filling audio array copy\n");
char theBytes[10] = {0,1,2,3,4,5,6,7,8,9};
for (int i = 0; i < sizeof(theBytes); i++) {
    toCopy[i] = theBytes[i];
}


env->SetByteArrayRegion(rawAudioCopy,0,10,toCopy);
printf("Finding object callback\n");
jmethodID aMethodId = env->GetMethodID(env->GetObjectClass(obj),"handleAudio","([B)V");
if(0==aMethodId) throw MyRuntimeException("Method not found error",99);
printf("Invoking the callback\n");
env->CallVoidMethod(obj,aMethodId, &rawAudioCopy);

然后是Java回调方法:

public void handleAudio(byte[] audio){
    System.out.println("Audio supplied to Java [" + audio.length + "] bytes");
    byte[] expectedAudio = {0,1,2,3,4,5,6,7,8,9};
    for (int i = 0; i < audio.length; i++) {
        if(audio[i]!= expectedAudio[i])
            System.err.println("Expected byte " + expectedAudio[i]
                    + " at byte " + i + " but got byte " + audio[i]);
        else System.out.print('.');
    }
    System.out.println("Audio passed back accordingly!");
}

调用回调时我得到以下输出:

library loaded!
Audio supplied to Java [-2019659176] bytes
Audio passed back accordingly!

最佳答案

在修正我的上述错误后,我现在正在寻找将原始字节数组复制回 Java 的最有效方法。我上面的内容似乎不太理想,因为我计划支持大量重复拷贝。我尝试将 char 数组直接传递给 setByteArrayRegion 调用,这似乎在这个简单的案例中有效,但我想知道是否需要执行固定。当您在 native 端创建新数组时,这是如何完成的?我是否只在设置后用 FALSE 调用 getByteArrayRegion?我可以在调用 Java 完成后取消固定吗?是否有高性能原始二进制数据穿梭回 java 的在线示例可供我学习?

关于java - JNI Stream 二进制数据从 C++ 到 Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2648877/

相关文章:

使用类路径的 Java Util 日志记录级别

所有类中对 Controller 的 Java FXML 引用

c++ - 检查反转数组是否与原始数组相同

java - 如何在字节数组 Java 中表示 header 值和实际消息?

C++ 动态转换失败/子对象被视为父对象

java - 在 java 的 jni 中使用非静态对象

java - 获取 "java.io.IOException: An existing connection was forcibly closed by the remote host"

java - 如何从 Eclipse 为 javaCV 或 openCV 项目制作可运行的 jar

java-native-interface - 从 JNI 加载 OSGi 类

Android 从 C++ JNI 代码中的另一个 Activity 类调用 Java 函数