마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

ndk 사용한 영상처리(이미지뷰 질문)

0 추천

카메라에서 넘겨받은 데이터를 native 단에서 처리를 해서 bitmap 으로 넘겨 받은 후 이미지 뷰로 띄어 보았습니다.

그런데 자꾸 널포인트 에러가 나타나서 보니 이미지뷰.셋이미지비트맵(비트맵) 쪽에서 널 포인터 에러가 나타납니다.

아래는 소스 코드입니다.

빨간색 글씨부분에서 널포인트에러가 발생합니다...

메인액티비티에서 이미지뷰를 잘 잡아줬구요 xml에서도 이미지뷰로 선언 했습니다...

무슨 문제일까요.ㅠ

package com.joy.testnativecamera;


import java.io.IOException;

import android.graphics.Bitmap;
import android.hardware.Camera;
import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.util.Log;
import android.view.Menu;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.Window;
import android.widget.ImageView;

public class MainActivity extends Activity {
 ImageView mImageview;
 private Preview mPreview;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  //setContentView(R.layout.activity_main);
  
  requestWindowFeature(Window.FEATURE_NO_TITLE);
  
  mPreview = new Preview(this);
        setContentView(mPreview);
  
  mImageview = (ImageView) findViewById(R.id.imageView1);
 }

 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
  // Inflate the menu; this adds items to the action bar if it is present.
  getMenuInflater().inflate(R.menu.activity_main, menu);
  return true;
 }

}

class Preview extends SurfaceView implements SurfaceHolder.Callback {
    SurfaceHolder mHolder;
    Camera mCamera;
    boolean mPreviewState;
    //private CameraPreviewHandler mCameraPreviewHandler;
    private Bitmap prBitmap;
    private MainActivity _MActivity=null;
    protected boolean toggle=false;
    int width = 0, height = 0;
    
    static {
     System.loadLibrary("histogram");
    }
    
    private native void HISTOGRAMCOMPRESS(Bitmap _outBitmap, byte[] _in);
    //private native void NdkTest(int a);
    
    Preview(MainActivity aaaaa) {
        super(aaaaa);
        
        _MActivity = aaaaa;
        
        // SurfaceHolder.Callback을 설정함으로써 Surface가 생성/소멸되었음을
        // 알 수 있습니다.
        mHolder = getHolder();
        mHolder.addCallback(this);
        mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
    }

    public void surfaceCreated(SurfaceHolder holder) {
        // Surface가 생성되었다면, 카메라의 인스턴스를 받아온 후 카메라의
        // Preview 를 표시할 위치를 설정합니다.
     
        
        try {
         mCamera = Camera.open();
         mCamera.setPreviewDisplay(holder);
         
         mCamera.setPreviewCallback(new Camera.PreviewCallback() {
    
    @Override
    public void onPreviewFrame(byte[] data, Camera camera) {
     // TODO Auto-generated method stub
     
     Camera.Parameters params = camera.getParameters();
     width = params.getPreviewSize().width;
     height = params.getPreviewSize().height;
     
     prBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
     
     HISTOGRAMCOMPRESS(prBitmap, data);
     
     _MActivity.mImageview.setImageBitmap(prBitmap);
    }
   });
        } catch (IOException exception) {
            mCamera.release();
            mCamera = null;
            // TODO: add more exception handling logic here
        }
    }

    public void surfaceDestroyed(SurfaceHolder holder) {
        // 다른 화면으로 돌아가면, Surface가 소멸됩니다. 따라서 카메라의 Preview도 
        // 중지해야 합니다. 카메라는 공유할 수 있는 자원이 아니기에, 사용하지 않을
        // 경우 -액티비티가 일시정지 상태가 된 경우 등 - 자원을 반환해야합니다.
        mCamera.stopPreview();
        mCamera = null;
    }

    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
        // 표시할 영역의 크기를 알았으므로 해당 크기로 Preview를 시작합니다.
        Camera.Parameters parameters = mCamera.getParameters();
        parameters.setPreviewSize(w, h);
        mCamera.setParameters(parameters);
        mCamera.startPreview();
    }

}

 

JJoy0327 (220 포인트) 님이 2013년 3월 14일 질문
아...다시 생각해보니... onCreate(Bundle savedInstanceState) 에서 setContentView(mPreview); 이렇게 선언해 놓고..뻘짓거리를 하고 있었네요..ㅠ
저는이걸 블루투스에다가 붙어넣기 했는데 뻑나는데 이유좀 알수 있을까요??

답변 달기

· 글에 소스 코드 보기 좋게 넣는 법
· 질문에 대해 추가적인 질문이나 의견이 있으면 답변이 아니라 댓글로 달아주시기 바랍니다.
표시할 이름 (옵션):
개인정보: 당신의 이메일은 이 알림을 보내는데만 사용됩니다.
스팸 차단 검사:
스팸 검사를 다시 받지 않으려면 로그인하거나 혹은 가입 하세요.
...