JNI将从C ++到Java的二进制数据流

时间:2010-04-15 20:49:42

标签: java c++ java-native-interface

我需要帮助将二进制数据传递给Java。我正在尝试使用jbytearray但是当数据进入Java时它看起来很糟糕。有人可以帮我一把吗?

这是一些示例代码的片段。首先是原生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!

2 个答案:

答案 0 :(得分:1)

在解决了上述错误之后,我现在正在寻找将原始字节数组复制回Java的最有效方法。由于我计划支持大量重复复制,因此我上面所看到的内容似乎有点不太理想。我尝试将char数组直接传递给setByteArrayRegion调用,这似乎在这个简单的情况下工作,但我想知道我是否需要执行固定。在本机端创建新数组时如何完成?我只是在设置之后用FALSE调用getByteArrayRegion吗?调用Java完成后,我可以取消固定吗?是否有可以从中学习的高性能原始二进制数据的在线示例?

答案 1 :(得分:1)

而不是

env->CallVoidMethod(obj,aMethodId, &rawAudioCopy);

env->CallVoidMethod(obj,aMethodId, rawAudioCopy, 0 , 10);