2011-12-03 12 views
2

Android NDKを使用してJavaから呼び出すC関数があります。基本的にはカメラのデータをYUVからRGB形式に変換します。問題は、Cで返されるオブジェクト型imageOutがjobject型の単純なオブジェクト型であるかどうかわかりません。これは私が(残念ながら私はで行くには他には何もありません)していたコードの抜粋です:Android NKでJNIを呼び出す問題

JNIEXPORT void JNICALL Java_com_twothreetwo_zoomplus_ZoomPlus_yuvrgb(JNIEnv *env, jobject obj, jbyteArray imageIn, jint widthIn, jint heightIn, jobject imageOut, jint widthOut, jint heightOut) 
{ 
    LOGI("width is %d; height is %d;",widthIn,heightIn); 

    jbyte *cImageIn = (*env)->GetByteArrayElements(env, imageIn, NULL); 
    jbyte *cImageOut = (jbyte*)(*env)->GetDirectBufferAddress(env, imageOut); 


    unsigned int *rgbs = (unsigned int*)cImageOut; 

    int half_widthIn = widthIn >> 1; 

     //the end of the luminance data 
     int lumEnd = (widthIn * heightIn) >> 1; 
     //points to the next luminance value pair 
     int lumPtr = 0; 
     //points to the next chromiance value pair 
     int chrPtr = lumEnd; 
     //the end of the current luminance scanline 
     int lineEnd = half_widthIn; 
     unsigned short *yuvs; 
     int x,y; 
     for (y=0;y<heightIn;y++) { 
     int yPosOut=(y*widthOut) >> 1; 
     for (x=0;x<half_widthIn;x++) { 
      //read the luminance and chromiance values 
      int Y1 = yuvs[lumPtr++]; 
      int Y2 = (Y1 >> 8) & 0xff; 
      Y1 = Y1 & 0xff; 
      int Cr = yuvs[chrPtr++]; 
      int Cb = ((Cr >> 8) & 0xff) - 128; 
      Cr = (Cr & 0xff) - 128; 

      int R, G, B; 
      //generate first RGB components 
      B = Y1 + ((454 * Cb) >> 8); 
      if (B < 0) B = 0; if (B > 255) B = 255; 
      G = Y1 - ((88 * Cb + 183 * Cr) >> 8); 
      if (G < 0) G = 0; if (G > 255) G = 255; 
      R = Y1 + ((359 * Cr) >> 8); 
      if (R < 0) R = 0; if (R > 255) R = 255; 
      int val = ((R & 0xf8) << 8) | ((G & 0xfc) << 3) | (B >> 3); 

      //generate second RGB components 
      B = Y1 + ((454 * Cb) >> 8); 
      if (B < 0) B = 0; if (B > 255) B = 255; 
      G = Y1 - ((88 * Cb + 183 * Cr) >> 8); 
      if (G < 0) G = 0; if (G > 255) G = 255; 
      R = Y1 + ((359 * Cr) >> 8); 
      if (R < 0) R = 0; if (R > 255) R = 255; 
      rgbs[yPosOut+x] = val | ((((R & 0xf8) << 8) | ((G & 0xfc) << 3) | (B >> 3)) << 16); 
     } 
     //skip back to the start of the chromiance values when necessary 
     chrPtr = lumEnd + ((lumPtr >> 1)/half_widthIn) * half_widthIn; 
     lineEnd += half_widthIn; 
     } 


    (*env)->ReleaseByteArrayElements(env, imageIn, cImageIn, JNI_ABORT); 
} 

私はonPreviewFrame機能で関数を呼び出しています:

public native void yuvrgb(byte[] yuvImageIn, int widthIn, int heightIn, Bitmap imageOut, int widthOut, int heightOut); 

    public void onPreviewFrame(byte[] data, Camera camera) 
    { 
     yuvrgb(data,480,640,bitmapWip,480,640); 
     cameraImageView.setImageBitmap(bitmapWip); 
    } 

あなたが見ることができるように、私は私はちょうどそのタイプを推測したように、私が間違っていると思うところであるビットマップとしてimageOutを宣言しています。

私は間違いを知らず、ただちにクラッシュします。誰かが私が間違っていることを知っていますか?

+0

を使用してビットマップに変換する必要がありますもともとOpenGLとIMHOのテクスチャに画像データをマップするために行われました。ImageOutはByteBufferでなければなりません(GetDirectBufferAddressはBufferからデータを読み込むために使用されるため)。しかし、私は最近、これも使用しようとし、それを動作させることはできませんでした。 –

+0

ええ、ちょうどそれをByteBufferにキャストしようとしましたが、それでもクラッシュします。私はあなたがそれを行う別の方法を見つけたとは思わない? –

答えて

1

cImageOutはバイト配列です。あなたのC関数の先頭で宣言です:

jbyte *cImageOut = (jbyte*)(*env)->GetDirectBufferAddress(env, imageOut);

あなたのJavaコードでバイト配列として宣言して、この例BitmapFactory.decodeByteArray

http://developer.android.com/reference/android/graphics/BitmapFactory.html#decodeByteArray%28byte[],%20int,%20int%29

+0

こんにちはエーザン、私はバイト配列としてそれをキャストしようとしましたが、アプリケーションが開いたらすぐにクラッシュしました。おそらく私は何か他のことを間違っているのでしょうか?これは私がやっていることです: private byte [] bitmapWip; –

+0

私はそれを解読しようとする前にクラッシュする:/ –

関連する問題