2010-04-15 4 views
5

Ich brauche Hilfe beim Übergeben von Binärdaten in Java. Ich versuche, jbytearray zu verwenden, aber wenn die Daten in Java gelangen, scheint es beschädigt zu sein. Kann mir jemand helfen?JNI Stream binäre Daten von C++ nach Java

Hier ist ein Ausschnitt aus einem Beispielcode. Zunächst wird die native C++ Seite:

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); 

und dann die Java-Callback-Methode:

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!"); 
} 

ich die folgende Ausgabe erhalten, wenn der Rückruf aufgerufen wird:

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

Ich glaube, ich mein Problem gefunden ... Dieser Aufruf: env-> CallVoidMethod (obj, aMethodId & rawAudioCopy); wurde an Ref statt an Wert übergeben. Wechseln zu: env-> CallVoidMethod (obj, aMethodId, rawAudioCopy); scheint das Problem anzugehen. Gibt es ein gutes Referenzhandbuch und Beispiele, um mich am Laufen zu halten? Ich bin wirklich verletzt um Hilfe hier. – Cliff

Antwort

1

Nach meinem obigen Fehler Zu Ich suche jetzt nach dem effizientesten Weg, rohe Byte-Arrays zurück nach Java zu kopieren. Was ich oben habe, scheint ein bisschen weniger als ideal, da ich eine hohe Anzahl von Wiederholungen unterstützen möchte. Ich experimentierte mit der Übergabe des char-Arrays direkt an den setByteArrayRegion-Aufruf, der in diesem einfachen Fall zu funktionieren scheint, aber ich frage mich, ob ich das Pinning durchführen muss. Wie erfolgt das, wenn Sie neue Arrays auf der nativen Seite erstellen? Rufe ich getByteArrayRegion nach dem Set einfach mit FALSE an? Kann ich nach dem Aufruf in Java den Anschluss abstecken? Gibt es Online-Beispiele für hochperformante rohe Binärdaten, die zu Java zurückfließen, von denen ich lernen kann?

1

statt

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

versuchen

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