2010-04-15 12 views
5

Necesito ayuda para pasar datos binarios a Java. Intento usar jbytearray, pero cuando los datos entran en Java, parece estar dañado. ¿Puede alguien darme una mano?Datos binarios de JNI Stream de C++ a Java

Aquí hay un fragmento de código de ejemplo. En primer lugar el lado nativo 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); 

y luego el método de devolución de llamada de 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!"); 
} 

me sale el siguiente resultado cuando se invoca la devolución de llamada:

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

Creo que he encontrado mi problema ... Esta llamada: env> CallVoidMethod (obj, aMethodId, y rawAudioCopy); estaba pasando por ref en lugar de por valor. Cambiando a esto: env-> CallVoidMethod (obj, aMethodId, rawAudioCopy); Parece que trata el problema. ¿Hay algún buen manual de referencia y ejemplos para seguir adelante? Me duele mucho la ayuda aquí. – Cliff

Respuesta

1

Después de la fijación de mi anterior error Ahora estoy buscando la forma más eficiente de copiar matrices de bytes sin procesar a Java. Lo que tengo arriba parece un poco menos que ideal, ya que estoy planeando apoyar una gran cantidad de copias repetidas. Experimenté con pasar la matriz de caracteres directamente a la llamada a setByteArrayRegion, que parece funcionar en este caso simple, pero me pregunto si debo realizar la fijación. ¿Cómo se hace eso cuando creas nuevas matrices en el lado nativo? ¿Acabo de llamar a getByteArrayRegion con un FALSE después del conjunto? ¿Puedo desconectarme una vez que finalice la llamada a Java? ¿Hay ejemplos en línea de datos binarios en bruto de alto rendimiento que regresen a Java de los que pueda aprender?

1

en lugar de

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

tratar

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