Cómo escribir y leer bytebuffer pasar de java a jni

Necesito ayuda con mi proyecto de Android. Quiero pasar un búfer de java a jni, y mi código C ++ rellenará los datos. Entonces java los mostrará en la pantalla. No estoy familiarizado mucho con C ++ y no tengo idea de cómo escribir para escribir en el búfer.

Esto es lo que conseguí. En java

ByteBuffer bb = ByteBuffer.allocateDirect(216); IssmJni.processBuffer(bb); 

Método nativo

 public static native void processBuffer(ByteBuffer bb); 

No uso jni_onload, así que no javah en C + +

 static void fillBuffer(JNIEnv *env, jclass clazz, jobject buf) { double *dBuf = env->GetDirectBufferAddress(env, buf); } 

Estoy atascado aquí, ¿puedo hacer doble dbuf? O tiene que ser un char ?

Digamos que quiero escribir 1,2,3,4,5 a este dbuf, ¿cómo lo hago? Estoy pensando en dbuf.put (1); … dbuf.put (5) pero no funciona. Y después de poblarlo, ¿Acabo de llamar bb.get (posición) en java?

Alguien aclarar esto para mí por favor, el ejemplo sería apreciado Gracias

Esta es mi tabla de métodos nativos

Static JNINativeMethod method_table [] = {

 {"fac" , "(J)J" , (void *) factorial}, {"getBuffer", "()[D" , (void *) getBufferNative}, //{"processBuffer", "(Ljava/nio/ByteBuffer)V", (void *) fillBuffer}}; 

Las otras dos obras bien excepto la última.

No uso jni_onload, así que no javah en C + +

Puede ser irrelevante para su pregunta, pero usted tipo de tener que hacer uno o el otro. Tampoco es necesario realizar la asignación de métodos Java a Native en la función onLoad o utilizar javah para generar las firmas de método que JNI puede recoger en tiempo de ejecución. De lo contrario, sus métodos nativos nunca serán invocados.

Sin embargo, si su método nativo se llama correctamente, lo que esté haciendo probablemente esté bien.

Estoy atascado aquí, ¿puedo hacer doble dbuf? O tiene que ser un char?

El valor devuelto de la función es realmente un void* , por lo que puede emitirlo a cualquier tipo de puntero que desee ya que es sólo una dirección de memoria. Sin embargo, el tipo de datos real del búfer directo será jbyte , que es un typedef de signed char , por lo que lo siguiente es probablemente mejor:

 jbyte *dBuf = env->GetDirectBufferAddress(env, buf); 

Digamos que quiero escribir 1,2,3,4,5 a este dbuf, ¿cómo lo hago?

La notación en C / C ++ para acceder a valores en una matriz es con [] notaciones, es decir:

 jbyte *dBuf = env->GetDirectBufferAddress(env, buf); dBuf[0] = 63; dBuf[1] = 127; // ...and so on... 

Y después de poblarlo, ¿Acabo de llamar bb.get (posición) en java?

Sí, puede utilizar los métodos de acceso en ByteBuffer para acceder a los datos que ha escrito desde su código nativo.

  • Creación de un android.graphics.Bitmap desde C ++
  • Cómo conectar una biblioteca C a la aplicación de iOS
  • Libusb_open_device_with_vid_pid falló al intentar acceder al dispositivo USB
  • JNI: Pasar varios parámetros en la firma de función para GetMethodID
  • No se puede resolver el símbolo webrtc en Android Studio
  • No se puede obtener el valor JNIEnv * en contexto arbitrario
  • Android Cómo leer JNI Core Dump FIles
  • No se encontró JNI_OnLoad en ... saltando init
  • Android JNI - Llamar AttachCurrentThread sin DetachCurrentThread
  • ¿Cómo uso realmente ffmpeg en Android?
  • Android ffmpeg simple JNI envoltorio
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.