JNI流:从C++向Java传输二进制数据

6

我需要帮助将二进制数据传递到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!

我想我找到了问题所在... 这个调用: env->CallVoidMethod(obj,aMethodId, &rawAudioCopy); 是按引用而非按值传递的。将其更改为: env->CallVoidMethod(obj,aMethodId, rawAudioCopy); 似乎解决了问题。有没有什么好的参考手册和示例可以让我继续前进?我真的很需要帮助。 - Cliff
2个回答

1
在修复了上述错误后,我现在正在寻找将原始字节数组复制回Java的最有效方法。我上面的代码似乎不太理想,因为我计划支持大量重复复制。我尝试直接将char数组传递给setByteArrayRegion调用,在这种简单情况下似乎可以工作,但我想知道是否需要执行固定操作。当您在本机端创建新数组时,该如何进行固定操作?我只需在设置后使用FALSE调用getByteArrayRegion吗?在调用进入Java后,我可以取消固定操作吗?是否有在线示例可以学习高性能的原始二进制数据传输回Java?

1

代替

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接