카메라에서 넘겨받은 데이터를 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();
}
}