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
- Recuperar android.os.Build ... propiedades del sistema mediante la aplicación puramente nativa de Android
- Libusb_open_device_with_vid_pid falló al intentar acceder al dispositivo USB
- No se encontró JNI_OnLoad saltando init> Apagado de la aplicación
- JNI: Pasar varios parámetros en la firma de función para GetMethodID
- Error de libcurl CURLE_SSL_CACERT_BADFILE en android
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.
- Compilar Java para Android nativo en lugar de escribir en C
- Temporizador de alta precisión en Android JNI
- Android: La forma más eficiente de pasar algunos bytes de sólo lectura a C ++ nativo
- Android: concatenar dos videos
- Obtener un ANativeWindowBuffer de ANativeWindow_Buffer
- JNI: Del código C a Java y JNI
- Uso de bibliotecas pre-construidas y jni en Android Studio
- Enviar cadena C ++ a Java a través de JNI
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