JNI Поток двоичных данных из C ++ в Java - PullRequest
5 голосов
/ 16 апреля 2010

Мне нужна помощь в передаче двоичных данных в 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 ]

1 голос
/ 20 ноября 2013

вместо

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

попробовать

env->CallVoidMethod(obj,aMethodId, rawAudioCopy, 0 , 10);
1 голос
/ 16 апреля 2010

После исправления моей вышеуказанной ошибки я сейчас ищу наиболее эффективный способ копирования необработанных байтовых массивов обратно в Java. То, что я имею выше, кажется немного менее идеальным, так как я планирую поддерживать большое количество повторных копий. Я экспериментировал с передачей массива char непосредственно в вызов setByteArrayRegion, который, кажется, работает в этом простом случае, но мне интересно, нужно ли мне выполнять закрепление. Как это сделать, когда вы создаете новые массивы на нативной стороне? Должен ли я просто вызвать getByteArrayRegion с FALSE после набора? Могу ли я отменить закрепление после завершения вызова в Java? Существуют ли в Интернете примеры высокопроизводительных необработанных двоичных данных, возвращающихся к Java, из которых я могу поучиться?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...