結論から言えば、/dev/graphics/fb0 へのアクセス権限があれば、
NDK を使ってスクリーンショット(キャプチャ)Androidアプリを作れます。
検証用に、エミュレーター/ADP1で、同ディレクトリのアクセス権を変更し、
NDK を使ってフレームバッファをコピーするソースコードを書いて、Androidアプリに組み込んで実行してみたところ、
スクリーンショット(キャプチャ)をとることができました。
ですが、
肝心の HT-03A では、そもそも root 権限を取得できないので、結局のところ、この方法は使えません。。。
参考までに試してみたソースコードの断片を貼っておきます。。。
C言語側のサンプルソースコード
// 説明を簡略化するために、エラー処理など諸々省略・・・
struct fb_fix_screeninfo fi;
struct fb_var_screeninfo vi;
int fd = open("/dev/graphics/fb0", O_RDONLY);
ioctl(fd, FBIOGET_FSCREENINFO, &fi);
ioctl(fd, FBIOGET_VSCREENINFO, &vi);
// 例えば、
// vi.xres には 320 [pixel]
// vi.yres には 480 [pixel]
// vi.bits_per_pixel には 16 [bpp]
// などの値を取得できます
void *bits = mmap(0, fi.smem_len, PROT_READ, MAP_SHARED, fd, 0);
// ここでC言語側でメモリを確保して返すか、
// 呼び出し側(Java)で確保したメモリ(※1)にコピーする(※2)
munmap(bits, fi.smem_len);
close(fd);
※1: Java 側のサンプルコード
ByteBuffer buffer = ByteBuffer.allocate(必要なメモリサイズ); hoge(buffer.array()); // ここで C言語側に渡す Bitmap bitmap = Bitmap.createBitmap(幅(320とか), 高さ(480), Bitmap.Config.RGB_565(16bppの場合)); bitmap.copyPixelsFromBuffer(buffer); // 16BPP のBMP 完成!
※2:C言語側のサンプルソースコード
hoge
(
JNIEnv* env,
jobject thiz,
jbyteArray buffer
)
{
...
jbyte* jbyteBuffer = (*env)->GetByteArrayElements(env, buffer, &b);
memcpy(jbyteBuffer, bits, fi.smem_len);
(*env)->ReleaseByteArrayElements(env, buffer, jbyteBuffer, 0);
...
}