nazareno logo ejemplos descargar java c jni

java - logo - Byte stream/C/JNI



jni nazareno (4)

¿Qué tipos de datos se usan generalmente en la implementación de la API C para almacenar flujos de bytes? ¿Cómo puedo convertir este tipo a jbyteArray?


Eso sería (const) unsigned char * que representa un bloque de memoria que contiene los bytes, junto con un size_t que le indica el número de bytes.

Este hilo parece repasar cómo crear un tipo de Java adecuado (NewByteArray () es la función).


Tu pregunta no es muy clara.

Suponiendo que tiene algunos bytes en C que representan caracteres, la mejor idea es obtener los bytes en Java y convertirlos a texto allí utilizando las conversiones de bytes de Java.

En JNI simplemente necesita materializar una matriz de Java, ya sea utilizando JNI para instanciar una, o pasando una referencia como parámetro (para lo cual aún necesita "materializar" un puntero en el código JNI).

He hecho esto último antes, así que aquí está el código FYI. Esta llamada JNI usó una AS / 400 C API para leer un registro de la base de datos y devolver los bytes a Java: el código Java luego utilizó información de formato de registro para extraer los campos en cadenas. Espero que esto sea de alguna ayuda:

JNIEXPORT jboolean JNICALL Java_com_xxx_DB2File_jniRead(JNIEnv *jep, jobject thsObj, jlong handle, jint readOp, jbyteArray jvaDta, jint jvaDtaMax, jint flags) { OBJDTA *odp; jbyte *jniDta; _RIOFB_T *fbp; thsObj=thsObj; if((odp=getDataspace(handle))==NULL) { throwEscape(jep,90003,"Invalid handle for dataspace in jniRead()"); return JNI_FALSE; } jniDta=(*jep)->GetByteArrayElements(jep,jvaDta,0); // read database record here if(fbp->num_bytes<=0) { (*jep)->ReleaseByteArrayElements(jep,jvaDta,jniDta,JNI_ABORT); /* do not copy changed array back to java */ return JNI_FALSE; } if(fbp->num_bytes!=odp->rcdLen) { byte errtxt[201]; asd_errtxt(errno,errtxt,sizeof(errtxt)); (*jep)->ReleaseByteArrayElements(jep,jvaDta,jniDta,JNI_ABORT); /* do not copy changed array back to java */ throwEscape(jep,90204,"Native function jniRead failed. Got %i, expected %i (%s)",fbp->num_bytes,odp->rcdLen, errtxt); return JNI_FALSE; } (*jep)->ReleaseByteArrayElements(jep,jvaDta,jniDta,0); /* copy changed array back to java */ return JNI_TRUE; }


No necesita convertirlos. Los tipos jbyteArray y char * son compatibles.

Declaración de Java:

private static native int doSomething(bate[] string, int length);

C delación:

JNIEXPORT jint JNICALL Java_package_class_doSomething(JNIEnv *env, jclass jc, jbyteArray string, jint length) { int i; for (i = 0; i < length; i++) { // read string[i] } }

Puede pasar los valores a Java de la misma manera. Pero asegúrese de que la longitud de la matriz de bytes se inicialice ANTES de llamar a la función C.