Байт потока / C / JNI - PullRequest
       11

Байт потока / C / JNI

1 голос
/ 23 января 2009

Какие типы данных обычно используются в реализации C API для хранения потоков байтов? Как я могу преобразовать этот тип в jbyteArray?

Ответы [ 4 ]

1 голос
/ 20 января 2010

См. Пример Java_ReadFile_loadFile, где они используют NewByteArray () и возвращают его напрямую.

http://java.sun.com/developer/onlineTraining/Programming/JDCBook/jnistring.html

1 голос
/ 23 января 2009

Это будет (постоянный) беззнаковый символ *, представляющий блок памяти, содержащий сами байты, вместе с size_t, сообщающим вам количество байтов.

В этой теме , похоже, рассказывается, как создать подходящий тип Java (функция NewByteArray ()).

0 голосов
/ 27 января 2009

Вам не нужно конвертировать их. Типы jbyteArray и char * совместимы.

Объявление Java:

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

C, замедление:

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]
    }
}

Вы можете передавать значения обратно в Java таким же образом. Но убедитесь, что длина байтового массива инициализирована ДО вызова функции C.

0 голосов
/ 24 января 2009

Твой вопрос не очень понятен.

Предполагая, что у вас есть несколько байтов в C, представляющих символы, лучшая идея состоит в том, чтобы перевести байты в Java и преобразовать их в текст, используя преобразования байтов Java.

В JNI вам просто нужно материализовать массив Java, либо используя JNI для его создания, либо передавая ссылку в качестве параметра (для которого вам все еще нужно "материализовать" указатель в коде JNI). 1005 *

Я делал эту последнюю вещь раньше, так что вот код FYI. Этот вызов JNI использовал API-интерфейс AS / 400 C для чтения записи в базе данных и возврата байтов обратно в Java - код Java затем использовал информацию о формате записи для извлечения полей в строки. Надеюсь, что это поможет:

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;                                                                                                        
    }                                                                                                                       
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...