Kopírování bajtů vyrovnávací paměti s JNI

hlasů
15

Zjistil jsem spoustu tutoriálů / otázky, týkající StackOverflow, které se zabývají kopírování char pole od C / JNI stranu do něčeho jako byte [] v jazyce Java, ale ne opačně.

Používám nativní C knihovna, která očekává bajtové pole. Já prostě chci získat data z byte [] v Javě, do výhodně unsigned char [] v C.

Dlouhý příběh krátký: Jaký je nejlepší způsob kopírování dat z jBytearray v JNI? Existuje nějaký způsob, jak zjistit, že je to velikost?

Položena 10/02/2010 v 14:40
zdroj uživatelem
V jiných jazycích...                            


2 odpovědí

hlasů
15

Zde je funkční příklad jsem jen zvedl ze své knihovny, AS / 400 JNI vyřešit nativní ukazatel uživatelsky fronty k testování existence fronty je - zkopíruje knihovny fronty a název z bytového pole Java (již přeložené do kódu CCSID úlohy) do nativního kódu a použije ji. Vezměte na vědomí funkčních uvolnění volání; tyto mohou být změněny na kopírovat nativní obsah pole zpět do bytovými poli Java přesunout data na druhou stranu:

JNIEXPORT jboolean JNICALL Java_com_mycompany_jni400_UserQueue_jniResolve(JNIEnv *jep,jobject thsObj,                
jbyteArray queueLibrary,jbyteArray queueName) {                                                                             
    jbyte            *lib,*nam;                                                                                             
    bool             rtn;                                                                                                   

    thsObj=thsObj;                                                                                                          
    lib=(*jep)->GetByteArrayElements(jep,queueLibrary,0);                                                                   
    nam=(*jep)->GetByteArrayElements(jep,queueName,0);                                                                      
    rtn=(usrq_resolve((byte*)lib,(byte*)nam)!=NULL);                                                                        
    (*jep)->ReleaseByteArrayElements(jep,queueLibrary,lib,JNI_ABORT); /* abort to not copy back contents */                 
    (*jep)->ReleaseByteArrayElements(jep,queueName   ,nam,JNI_ABORT); /* abort to not copy back contents */                 
    if(rtn) { return JNI_TRUE;  }                                                                                           
    else    { return JNI_FALSE; }                                                                                           
    }                                                                                                                       
Odpovězeno 10/03/2010 v 09:09
zdroj uživatelem

hlasů
12

Nejlepší způsob, jak zkopírovat Java byte [] na rodáka char*je použití GetByteArrayRegionvolání. Dělá přesně to, co chcete: zkopíruje všechny nebo část pole bajtů do nativního vyrovnávací paměti.

Použití GetByteArrayElements/ ReleaseByteArrayElementsvyžaduje dva hovory namísto jedné, a v závislosti na realizaci VM bude buď pin byte [] v paměti, aby se zabránilo GC od pohybem, nebo způsobit kopie, takže GC se může volně pohybovat původní bez narušení nativní kód. (To také znamená, že JNI_ABORTse buď „zpět“ změny, nebo je nechat neporušený, v závislosti na tom, zda byl pufr sepnuté nebo kopírování).

(Viz také část „Kraj Hovory“ na JNI Tipy dokumentu.)

GetArrayLengthHovor může být použita k určení velikosti byte[].

Odpovězeno 19/03/2010 v 21:49
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more