2013-05-21 21 views
20

私はC++とJNIで初心者だけど、私は符号なしのJNIを使​​用して、C++でのchar *、およびその逆にJavaで[]バイトを変換する正しい方法を見つけよう! (私はアンドロイドで働いています) GoogleとSOのソリューションを探した後、私はバイトの[]をC++に変換するための詳細な方法を見つけられませんでした。私を助けてください。逆も同様です(C++のunsigned char *からjavaのbyte []への解決策を提供してください)。おかげで非常に多くC++でjavaのbyte []をC++のunsigned char *に変換する正しい方法はありますか?

  • バイト[] JavaでC++でのunsigned char型*に:

JAVA:

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

JNI:

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

PS:私は私の問題のための本当の問題であることのため、私の質問を修正:(

+0

まあ、それはあります。 CでC++を書くことはできません。本当の質問ではありません。 – EJP

+0

@EJPあなたは私のすべての質問を読んでいないと思います!主な質問は、 "私はC++とJNIの初心者ですが、JNIを使​​用してC++のunsigned char *にbyte []を変換する正しい方法を見つけようとしています。私は間違っていて、その逆の解決法を提供しています(C++のunsigned char *からjavaのbyte []へ)! "あなたは私を助けることができます ?私はあなたがすべての質問を読んでいないなら、あなたは私の意見をダウングレードしてはならないと思います! –

+0

は、C++コンパイラを使ってC++コードをコンパイルしようとしているようです。 – Zharf

答えて

51

あなたは他の方法で回避を変換すること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; 
} 

unsigned char配列を変換するために、これを使用することができます...

当然の
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

以下の解決方法はどうですか?それはあなたのものと違うのですか?何が良い? 'jbyte * content_array =(* ENV) - > GetByteArrayElements(ENV、アレイ、NULL); \t //もし(content_array == NULL) \t \tが// 0を返します。 \t \t ReceiveDataFromServer(content_array、array_length)。 \t(* ENV) - > ReleaseByteArrayElements(ENV、アレイ、content_array、JNI_ABORT)。 ' –

+1

それはほとんど同じように動作します。違いは、あなたのコードではネイティブコードにデータを入れるためのバッファを用意していますが、私のバージョンではネイティブコードがバッファを作成しています。どちらが良いかは、ユースケースによります。 – Zharf

+0

@Zharf、 "buf"はas_unsigned_char_array()でどのように解放されますか? – ransh

関連する問題