2013-05-21 11 views
20

C++ ve JNI'de yeni kullanıcıyım, JVI kullanarak C++ 'da imzasız char *' a java'da byte [] 'i çevirmek için doğru bir yol bulmaya çalışıyorum, ya da tam tersi! (Android üzerinde çalışıyorum) Google ve SO'da bir çözüm aradıktan sonra, java'da C++ 'ye byte [] dönüştürmek için iyi bir ayrıntı bulamadım. Lütfen bana yardım edin ve tersi için bir çözüm sunun (java'daki C++ - bayt [] için imzasız char *). Çok teşekkürlerJava'da byte [] 'i C++' daki imzasız char * 'ya dönüştürmek için doğru bir yol var mı?

  • byte [] C++ imzasız char * için java:

JAVA:

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

JNI:

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

PS: Benim sorunum :(Sen tersi dönüştürmek için 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; 
} 

içine unsigned char dizi dönüştürmek için kullanabilir

+0

Elbette öyle. C++ yazamazsınız. Ciddi bir soru değil. – EJP

+0

@EJP Sanırım tüm sorumu okumadınız! Ana soru "Ben C++ ve JNI newbie, ben JNI kullanarak C++ imzasız char * java byta [] byte dönüştürmek için doğru bir yol bulmaya çalışıyorum, ve tersi! .... Lütfen beni düzeltin Yanlışım ve tersi için bir çözüm sağlayın (javada C++ - bayt [] için imzasız char *) "! Bana yardım edebilir misin? Tüm sorumu okumadıysan, notumu düşürmemelisin! –

+0

, C++ kodunu derlemek için bir c derleyicisi kullanmaya çalıştığınız gibi görünüyor. – Zharf

cevap

51

...

için gerçek bir soru olduğu için sorumu modifiye
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

aşağıdaki çözümden nasıl, sizinkilerden farklı mı? Hangisi daha iyi? 'jbyte * content_array = (* env) -> GetByteArrayElements (env, array, NULL); \t // if (content_array == NULL) \t \t // return 0; \t \t ReceiveDataFromServer (content_array, array_length); \t (* env) -> ReleaseByteArrayElements (env, array, content_array, JNI_ABORT); –

+1

Bu hemen hemen aynı şekilde çalışacaktır. Fark, kodunuzda, yerel koda veri koymak için bir arabellek sağlamanızdır, benim versiyonumda, yerel kod arabelleği oluşturur. Hangisi daha iyi ise kullanım durumuna bağlıdır. – Zharf

+0

@Zharf, nasıl "buf" as_unsigned_char_array() içinde serbest olsun? – ransh

İlgili konular