2013-05-21 12 views
20

Ich bin Neuling in C++ und JNI, ich versuche, einen korrekten Weg zu finden, byte [] in Java in unsigned char * in C++ mit JNI zu konvertieren, und umgekehrt! (Ich arbeite an Android) Nach der Suche nach einer Lösung in Google und SO, habe ich keinen guten Weg gefunden, Byte [] in Java in C++ zu konvertieren. Bitte helfen Sie mir, und bieten Sie eine Lösung für ein umgekehrt (unsigned char * in C++ zu Byte [] in Java). Vielen DankEin richtiger Weg, um byte [] in Java in unsigned char * in C++ zu konvertieren, und umgekehrt?

  • byte [] in Java zu 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: Ich änderte meine Frage für eine wirkliche Frage für mein Problem zu sein :(

+0

Nun natürlich ist es. Sie können C++ nicht in C schreiben. Keine wirkliche Frage. – EJP

+0

@EJP Ich denke du hast nicht alle meine Fragen gelesen! Die Hauptfrage lautet "Ich bin Neuling in C++ und JNI, ich versuche einen korrekten Weg zu finden, byte [] in Java in unsigned char * in C++ mit JNI zu konvertieren, und umgekehrt! .... Bitte korrigieren Sie mich, wenn Ich liege falsch und biete eine Lösung für ein umgekehrtes (unsigned char * in C++ zu Byte [] in Java) "! Kannst du mir helfen ? Ich denke, du solltest meinen Punkt nicht herabstufen, wenn du nicht alle Fragen gelesen hast! –

+0

scheint mir, als ob Sie versuchen, einen C-Compiler zu verwenden, um C++ - Code zu kompilieren. – Zharf

Antwort

51

du unsigned char Array in eine 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; 
} 

um konvertieren können Sie die andere Art und Weise konvertieren ...

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

Wie sieht es mit der folgenden Lösung aus, ist es anders als Ihre? Was ist besser? 'jbyte * content_array = (* env) -> GetByteArrayElements (env, Array, NULL); \t // if (content_array == NULL) \t \t // zurück 0; \t \t ReceiveDataFromServer (content_array, array_length); \t (* env) -> ReleaseByteArrayElements (env, array, content_array, JNI_ABORT); ' –

+1

Das wird ziemlich genau so funktionieren. Der Unterschied besteht darin, dass Sie in Ihrem Code dem nativen Code einen Puffer zur Verfügung stellen, in den Daten eingefügt werden können. In meiner Version erstellt der native Code den Puffer. Was besser ist, hängt vom Anwendungsfall ab. – Zharf

+0

@Zharf, wie wird "buf" in as_unsigned_char_array() freigegeben? – ransh

Verwandte Themen