一千萬個為什麽

搜索

JNI將二進制數據從C ++流式傳輸到Java

我需要幫助將二進制數據傳遞給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!

最佳答案

在解決了上述錯誤之後,我現在正在尋找將原始字節數組復制回Java的最有效方法。由於我計劃支持大量重復復制,因此我上面所看到的內容似乎不太理想。我嘗試將char數組直接傳遞給setByteArrayRegion調用,這似乎適用於這個簡單的情況,但我想知道是否需要執行固定。在本機端創建新數組時如何完成?在集合之後我是否只使用FALSE調用getByteArrayRegion?調用Java完成後,我可以取消固定嗎?是否存在可以從中學習的高性能原始二進制數據的在線示例?

轉載註明原文: JNI將二進制數據從C ++流式傳輸到Java