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.

  • CLI en DalvikVM falla en JNI lib
  • JNI / Android: llamada a un método no estático en Java desde C ++?
  • Utilizar bibliotecas jni de 32 bits en android de 64 bits
  • Temporizador de alta precisión en Android JNI
  • Llamar al miembro de la clase JAVA desde el código nativo C / C ++
  • Android: JNI ERROR (error de aplicación): desbordamiento de tabla de referencia local (máx = 512)
  • JNIEXPORT y JNICALL en Android NDK
  • CheckJNI de Android: ¿Cómo apagarlo / encender (en un emulador)? La documentación parece estar defectuosa
  • Suma de dos valores usando ndk android
  • Cómo utilizar c / cpp biblioteca / funciones en android
  • C ++ y JNI - Cómo pasar una matriz en un jfloatArray
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.