2011-01-12 25 views
3

符号なしcharバッファをjbyteArrayに変換するにはどうすればよいですか?私はC++バッファを取得し、JNIを通してJavaに戻ります。unsigned charをjbyteArrayに変換する方法

これはこれを行うための私の現在のコードです。

JNIEXPORT jbyteArray JNICALL Java_com_rmsdk_wrapper_RMServices_getImageBuffer(JNIEnv *env, jobject thiso, 
    jint w, jint h) { 
    emh::PNGSurface * surface = services->getImageBuffer(w,h); 
jbyteArray * buffer = (jbyteArray*)malloc(sizeof(jbyteArray)*surface->getBufferSize()); 
    unsigned char * imgBuff = surface->getBuffer(); 

    for(int i = 0; i < surface->getBufferSize();i++){ 
     buffer = imgBuff; 
     buffer++; 
     imgBuff++; 
    } 
    return *buffer; 
}; 

コンパイル時に次のエラーが発生しました。

Compile++ thumb : rmsdk <= RMSDK_Wrapper_JNI.cpp 
/home/marcos/dev/workspace/rmsdk.native.wraper/jni/RMSDK_Wrapper_JNI.cpp: In function '_jbyteArray* Java_com_rmsdk_wrapper_RMServices_getImageBuffer(JNIEnv*, _jobject*, jint, jint)': 
/home/marcos/dev/workspace/rmsdk.native.wraper/jni/RMSDK_Wrapper_JNI.cpp:37: error: cannot convert 'unsigned char*' to '_jbyteArray**' in assignment 
make: *** [/home/marcos/dev/workspace/rmsdk.native.wraper/obj/local/armeabi/objs/rmsdk/RMSDK_Wrapper_JNI.o] Error 1 

yy。

+1

jbyteArrayはJVMで作成する必要があります。通常のCメモリの場所を返すことはできません。これはJVMをクラッシュさせます。また、バイト配列の値を設定するヘルパーメソッドを使用する必要があります。 –

答えて

5

は特に、these JNI array operationsを参照してください。

  • NewByteArray
  • GetArrayElements
  • ReleaseArrayElements

あなたは事前に、配列の最大サイズを知っている場合、あなたはNewByteArray呼び出しを避けることができます。

これを頻繁に呼び出すと、JNAを使用するほうが簡単になる場合があります。

+0

私はNewByteArrayを作成し、署名のないcharバッファからjbyteバッファにコンテンツをコピーし、SetArrayByteRegionを配列に使用して解決しました。これは私の問題を解決します。これはAndroid向けですが、私はJNAを使用することはできません。 –