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
- Uso de funciones nativas en Android con OpenCV
- Utilizar una clase simple de C ++ en Android NDK
- Invocación de funciones JNI en el nombre del paquete de Android que contiene subrayado
- No se puede acceder a AAssetManager en código nativo pasado de Java en WallpaperService
- Unsatisfiedlinkerror en android (eclipse)
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.
- Cómo llamar a función Java desde c
- Android ffmpeg .so descargar
- Cómo ver la tabla de referencia local de JNI?
- ¿Utilizar un archivo mapeado en memoria como un archivo de intercambio?
- ¿Cómo utilizar la biblioteca JNI compilada por NDK en una aplicación Java normal no Android?
- Android ioctl: permisos y uso de root
- Creación de un android.graphics.Bitmap desde C ++
- Mantenga en "Tratar de cargar lib" y no hay retorno para siempre
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.
- Cómo ejecutar Prueba Travis-CI y Espresso
- Android: No se pudo crear el directorio para el archivo SharedPreferences