2013-02-28 9 views
5

döndürme Burada gerçekten büyük bir sorun yaşıyorum. Java'dan C++'ya bir bayt [] aktarmaya çalışıyorum ve dönüşümden sonra negatif değerler alıyorum. Java byte [] 'da benzersiz karakterlere sahip olmanın problemi çözdüm. Bu, dönüştürme ve bir kayıt yaptıktan sonra, değerler 0 veya negatiftir.JNI Java baytının [] öğesini C++ bytearray'e dönüştürülmesi, 0

Dize karakterleri bir test bayt [] kullanmayı denedim ve iyi çalışıyor.

Yardım ederse, kodum İşte.

Java

public static native void SendMessage(byte[] message, int size); //size = message.length 

C++

static void SendMessage(JNIEnv *env, jclass cls, jbyteArray array, jint array_length) 
{ 
    jbyte* content_array = (env)->GetByteArrayElements(array,NULL); 
    //*env->GetByteArrayRegion(array,0,array_length,content_array); //tried this as well, same results 
    LOGD("content:\n"); 
    for (int i=0; i < array_length; i++) 
    { 
     LOGD("%d",content_array[i]); 
    } 

    //EDIT 
    SendMessage(client, (uint8_t*)content_array, array_length); //<- could the problem be at the point where I convert it to uint8_t? 

     (env)->ReleaseByteArrayElements(array,content_array,0); 
    } 

Şimdi

content: 48 
content: 23 
content: 13 
content: 56 
content: 0 // <--- the problem starts here 
content: -122 
content: 0 
content: 78 
content: 32 
content: -28 
etc... 
.. 
.. 

Çıkış, basit bir test byte [] Java

String test = "ABC"; 
byte[] message = test.getBytes(); 
public static native void SendMessage(byte[] message, int size); //size = message.length 
0 kullanılarak

C++

static void SendMessage(JNIEnv *env, jclass cls, jbyteArray array, jint array_length) 
{ 
    jbyte* content_array = (env)->GetByteArrayElements(array,NULL); 
    //*env->GetByteArrayRegion(array,0,array_length,content_array); //tried this as well, same results 
    LOGD("content:\n"); 
    for (int i=0; i < array_length; i++) 
    { 
     LOGD("%d",content_array[i]); 
     } 
     (env)->ReleaseByteArrayElements(array,content_array,0); 
    } 

Çıktı Yardımlarınız için

content: 65 //this works perfectly 
content: 66 
content: 67 

teşekkür ederiz. Çok takdir edildi.

cevap

1

Sorun durumunda byte[] dizisini nasıl ediniyorsunuz? Bu aynı zamanda String'dan bir dönüşüm mü? Eğer öyleyse, günlük çıktınızda sıfırları ve negatif değerleri almak tam olarak geçerli olabilir. Bir bayt dizisine dönüştürmek için kullandığınız giriş karakterlerine ve kodlamaya bağlıdır. Basit metninizle olduğu gibi String.getBytes() kullanıyorsanız, platform varsayılan kodlamasını kullanıyor olacaksınız. Basit durumunuz, varsayılan kodlamanın ASCII uyumlu bir şey olduğunu gösterir.

+0

Cevabınız için teşekkür ederiz. Hayır, bir String dönüşümünden byte [] alamıyorum. Bayt [] başka bir kaynaktan aktarılır. Java tarafında günlüğe kaydetme amaçları için String'e dönüştü ve benzersiz karakterler içerdiğini gördüm. Farklı kodlamalardan söz ettiniz. Platform varsayılanından farklı bir kodlama nasıl ayarlanır? – user2117849

+0

[String.getBytes (Charset)] kullanın (http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#getBytes (java.nio.charset.Charset)). –

1

Sorunun burada olduğunu düşündüğünüzden emin değilim. Java'da, byte imzalı bir türdür, bu nedenle negatif bir değer beklenmedik değildir. Jbyte, eşleşecek bir 8-bit imzalı C++ türüdür.

büyük olasılıkla açıklamalar verilmiştir:

  • Bu bayt dizisi oluştururken bazı yol yapay doku; Örneğin. Eğer daha geniş Nedense

    • : Eğer

    • Yanlış size parametrenin değerini ele verdik (... sıfır aksi belirtmek eğiliminde olacaktır rağmen) UTF-8 olarak kodlanmış olması bayt dizisi boyutundan daha fazla.

    • Bayt dizisine bir şeyler yazan işlem, içine size bayt koymadı.


Bu sizin JNI'yı kodu 0 <= size < message.length olmadığını kontrol etmediğini dikkati çekiyor. Bu yöntem aralık dışı olan bir size argümanı ile çağrılırsa, sabit bir JVM çökmesine yol açacak segmentasyon hataları dahil olmak üzere kötü şeyler olabilir.

+0

Teşekkürler Stephen cevap için hayır, ben boyut doğru olduğundan emin olmak için bir kontrol yaptım. Bununla birlikte, yazımımda (düzenlendiği tarihten), dönüştürülen diziyi bir uint8_t'ye dönüştürdüğümden bahsetmedim. Alıcı ucun neden sadece 0'a kadar mesajını okuyabileceği sorun olabilir mi? Uint8_t 0 ve negatif değerleri destekliyor mu? – user2117849

+0

"uint8_t" değerleri 0 ile 255 arasındadır. Bununla birlikte, bu bir C/C++ döküm olduğundan, dizideki değerleri işaretsiz olarak işleme koymak için * kodu söylersiniz. Her neyse, güncellemelere dayanarak, sorunun bize göstermiş olduğunuz kodda olduğunu düşünmüyorum. –