2013-05-21 16 views
20

Sono novizio in C++ e JNI, cerco di trovare un modo corretto per convertire il byte [] in java in unsigned char * in C++ usando JNI e viceversa! (Sto lavorando su Android) Dopo aver cercato una soluzione in google e SO, non ho trovato un buon modo per convertire i byte [] in java in C++. Per favore aiutami e fornisci una soluzione per un vice versa (char unsigned * in C++ a byte [] in java). Grazie milleUn modo corretto per convertire il byte [] in java in unsigned char * in C++ e viceversa?

  • byte [] in Java per unsigned char * in C++:

JAVA:

private static native void nativeReceiveDataFromServer(byte[] value, int length); 

JNI:

... (JNIEnv* env, jobject thiz, jbyteArray array, jint array_length) 
{ 
    ??? 
} 

PS: ho modificato la mia domanda per essere un vero problema per il mio problema :(

+0

Beh, certo che lo è. Non puoi scrivere C++ in C. Non è una domanda reale. – EJP

+0

@EJP Penso che tu non abbia letto tutta la mia domanda! La domanda principale è "Sono novizio in C++ e JNI, cerco di trovare un modo corretto per convertire il byte [] in java in unsigned char * in C++ usando JNI, e viceversa! .... Per favore correggimi se Ho sbagliato, e fornire una soluzione per un vice versa (char unsigned * in C++ a byte [] in java) "! Potresti aiutarmi ? Penso che non dovresti declassare il mio punto se non hai letto tutta la domanda! –

+0

mi sembra che tu stia cercando di usare un compilatore c per compilare codice C++. – Zharf

risposta

51

È possibile utilizzare questo per convertire unsigned char array in un jbyteArray

jbyteArray as_byte_array(unsigned char* buf, int len) { 
    jbyteArray array = env->NewByteArray (len); 
    env->SetByteArrayRegion (array, 0, len, reinterpret_cast<jbyte*>(buf)); 
    return array; 
} 

per convertire il contrario ...

unsigned char* as_unsigned_char_array(jbyteArray array) { 
    int len = env->GetArrayLength (array); 
    unsigned char* buf = new unsigned char[len]; 
    env->GetByteArrayRegion (array, 0, len, reinterpret_cast<jbyte*>(buf)); 
    return buf; 
} 
+0

che dire della soluzione qui sotto, è diverso dal tuo? Cosa c'è di meglio? 'jbyte * content_array = (* env) -> GetByteArrayElements (env, array, NULL); \t // if (content_array == NULL) \t \t // return 0; \t \t ReceiveDataFromServer (array_dati, matrice_lunghezza); \t (* env) -> ReleaseByteArrayElements (env, array, array_dati, JNI_ABORT); ' –

+1

Funzionerà più o meno lo stesso. La differenza è che nel codice si fornisce al codice nativo un buffer per inserire i dati, nella mia versione il codice nativo crea il buffer. Quale è meglio dipende dal caso d'uso. – Zharf

+0

@Zharf, come viene liberato "buf" in as_unsigned_char_array()? – ransh

Problemi correlati