JNIEXPORT jint JNICALL Java_com_frame_FrameBufferTest_getFrameBuffer(JNIEnv *env, jobject thiz, jbyteArray jByte)
{
struct fb_var_screeninfo vi;
struct fb_fix_screeninfo fi;
int WIDTH = 480;
int HEIGHT = 800;
int BYTE_PER_PIXEL = 4;
int SCREEN_NUM = 1; // 화면 갯수
int READ_BYTE = WIDTH * HEIGHT * BYTE_PER_PIXEL * SCREEN_NUM;
unsigned short * pFrame=NULL;
// open fb0
int fp= open("/dev/graphics/fb0", O_RDONLY);
if(fp<0)
return errno;
// get pointer
pFrame=NULL;
pFrame = mmap(0, READ_BYTE, PROT_READ, MAP_SHARED, fp,0 );
if( pFrame==MAP_FAILED )
{
close(fp);
return errno;
}
// set buffer
(*env)->SetByteArrayRegion(env, jByte, 0, READ_BYTE, (jbyte*)pFrame );
munmap(pFrame,READ_BYTE);
close(fp);
return 0;
}
이게 fb0를 읽어들이는 c파일이고
public class FrameBufferTest extends Activity {
/** Called when the activity is first created. */
ImageView frameView1, frameView2;
Bitmap bitmap1;
private native int getFrameBuffer(byte[] buff);
static {
System.loadLibrary("fbuffer");
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Button btn;
btn = (Button)findViewById(R.id.Button01);
btn.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
switch (v.getId()) {
case R.id.Button01:
frameView1.setImageBitmap(bitmap1);
break;
}
}
});
frameView1 = (ImageView) findViewById(R.id.FrameImageView1);
// get frame buffer
int WIDTH = 480;
int HEIGHT = 800;
int BYTE_PER_PIXEL = 4;
int SCREEN_NUM = 1; // 화면 갯수
int size = WIDTH * HEIGHT * BYTE_PER_PIXEL * SCREEN_NUM;
byte[] buffer = new byte[size];
// crate bitmap
BitmapFactory.Options bfo = new BitmapFactory.Options();
bfo.inPreferredConfig = Bitmap.Config.RGB_565;
bfo.outWidth = WIDTH;
bfo.outHeight = HEIGHT;
bitmap1 = Bitmap.createBitmap(WIDTH, HEIGHT, Bitmap.Config.RGB_565);
int ret = getFrameBuffer(buffer);
if (ret != 0) {
// 에러
bitmap1.eraseColor(Color.RED);
bitmap2.eraseColor(Color.RED);
Log.i("ERROR : ", ""+ret);
return;
}
// copy to bitmap
ByteBuffer BB = ByteBuffer.allocate(size/SCREEN_NUM);
BB.put(buffer, 0, size / SCREEN_NUM);
BB.rewind();
bitmap1.copyPixelsFromBuffer(BB);
}
}
이것은 java파일입니다.
캡쳐하고 저장하면(위 코드에서 저장하는 부분은 뺏습니다)
아래 사진처럼 나옵니다.
어디가 잘못된걸까요

참고 사이트는 http://blog.naver.com/lovinghc/30105147933 입니다.
답변 감사드립니다. RGB_565를 ARGB_8888로 바꾸니 해결되었네요. objects님이 말씀하신게 맞는것 같습니다.
아래는 좀 더 개선시킨 프로그램인데요, 문제는 저 빨강색이 사실은 파랑색입니다. 캡쳐하고나니 맘대로 색을 바꿔버리네요
잘 보시면 와이파이도 초록색이어야 할 터인테 초록색 비스무리한 색이...
바이트 퍼 픽셀이 4로 설정돼 있네요. 그럼 총 32비트인건데요. 보통 포토샵에서 PNG가 저장될 때는 24비트로 저장이 될텐데요. 이 부분도 확인해보시기 바랍니다. 24비트라면 BPP를 3으로 주셔야 겠지요.
for(int x=0;x<480;x++){
for(int y=0;y<800;y++){
t = bitmap1.getPixel(x, y);
b = (t & 0x000000FF)<<16;
r = (t & 0x00FF0000)>>16;
t = t & 0xFF00FF00;
t = t | b;
t = t | r;
bitmap1.setPixel(x, y, t);
}
}요렇게 Red값과 Blue값을 뒤바꾸니 정상적으로 나오긴 하는데 겁나 느려졌네요 typedef struct bgra8888 {
char b;
char g;
char r;
char a;
} bgra8888_t;
c 코드에 이런 구조체를 선언하고 from = (struct bgra8888 *)(jByte + vi.left_margin);
i=0;
while(i++ <WIDTH * HEIGHT ) {
tmp = from->b;
from->b = from->r;
from->r = tmp;
from++;
}
요렇게 c코드에서 Red, Blue 값을 바꾸니 0.3초 정도 걸립니다.
code.google.com/p/android-fb2png/source/checkout 여기 코드를 참고했습니다.
저와 같은 문제를 겪고 계시네요ㅠㅠ
꼭 빨강과 파랑을 바꿔야 해결가능한지요?
그리고 fb0에서 받아온 화면이 현재 보여지는 화면이 아니라 이전에 보여졌던 화면이신가요?
전 이전에 보여졌던 화면이 나오는데...(1~2분 전 화면)
혹시 해결하셨나요?
http://code.google.com/p/android-fb2png/source/browse/img_process.c 이 코드를 보시면
rgb565, argb8888, bgra8888 에 따라 처리를 다르게 해주는데
제 추측으로는 기기마다 다르게 처리해야 하는것 같습니다.
저는 넥서스S를 사용하고 있어서 빨강과 파랑이 바뀌는것 같구요.
글에 나온 스샷은 rgb565를 사용했을 때고 댓글에 첨부한 스샷은 argb8888로 바꿔서 해결한 것입니다.




color depth가 안맞는것이 아닐까요?
소스를 봐도 native는 4byte이고, java측은 565 format이네요'