2014-10-28 8 views
5

Ho bisogno di ottenere array di byte da jni a Java. Es: Ho un byte array di byte [] a = {1,2,3,4,5,6}array di byte di ritorno in jni android?

JNIEXPORT jbyteArray JNICALL Java_com_vn_getArray (JNIEnv *env, jobject obj) { 
    jbyte[] a = {1,2,3,4,5,6}; 
    return a; 

}

non so come restituire un array di byte da JNI .

Qualcuno può aiutarmi? Per favore!

risposta

13

In Java, un array è un oggetto. Quindi per passare un array di byte da C o C++ a java è necessario creare un'istanza di jbyteArray e restituirlo. Invece di un array C. Per risolvere questo, vedere il codice seguente:

JNIEXPORT jbyteArray JNICALL Java_Test_returnArray 
    (JNIEnv *env, jobject This) 
{ 
     jbyte a[] = {1,2,3,4,5,6}; 
     jbyteArray ret = env->NewByteArray(6); 
     env->SetByteArrayRegion (ret, 0, 6, a); 
     return ret; 
} 

Sulla base di questa link

+0

non funziona, qualche soluzione? –

+0

Hai qualche eccezione? Qual è il valore di ritorno che puoi vedere sul lato Java? – TheDutchDevil

+0

@DungQuang Si prega di controllare il codice ora, ho avuto un po 'più di tempo per guardarlo e risolto un errore del compilatore piuttosto imbarazzante. Il codice modificato funziona per me e mi restituisce un array di byte sul lato Java con un conteggio di sei. – TheDutchDevil

2

mi piace che e sta funzionando

JNIEXPORT jbyteArray JNICALL Java_com_vn_getArray(JNIEnv *env, jobject obj) { 
    jbyte byteUrl[] = {1,2,3,3,4}; 
    int sizeByteUrl = 5; 

    jbyteArray data = (*env)->NewByteArray(env, sizeByteUrl); 
    if (data == NULL) { 
     return NULL; // out of memory error thrown 
    } 

    // creat bytes from byteUrl 
    jbyte *bytes = (*env)->GetByteArrayElements(env, data, 0); 
    int i; 
    for (i = 0; i < sizeByteUrl; i++) { 
     bytes[i] = byteUrl[i]; 
    } 

    // move from the temp structure to the java structure 
    (*env)->SetByteArrayRegion(env, data, 0, sizeByteUrl, bytes); 

    return data; 
}