3

私は Skia (ビルド済み) を使用して、Java サーフェスから取得した Android ネイティブ ウィンドウに描画しています。このコードは、Samsung Galaxy S3 (android 4.0.4 を搭載) を除いて、テストできるすべてのデバイスでうまく機能します。最初の画像は私が見るべきもので、2 番目の画像は Galaxy S3 に表示されるものです。

エミュレーターでのテストのスクリーンショット: 赤い四角形を示しています Samsung Galaxy S3 でのテストのスクリーンショット: 一連の赤地に黒の斜めのストライプが表示されます

長方形を描画する jni 関数は次のとおりです。

JNIEXPORT void JNICALL Java_com_test_TestSkia_InitializeWindow(JNIEnv* env, jobject thiz, jobject surface)
{
     ANativeWindow* window = ANativeWindow_fromSurface(env, surface);
     ANativeWindow_Buffer buffer;
     ANativeWindow_lock(window, &buffer, NULL);
     SkBitmap  bitmap;
     bitmap.setConfig(convertPixelFormat(buffer.format), buffer.width, buffer.height);
     bitmap.setPixels(buffer.bits);
     SkCanvas canvas;
     canvas.setBitmapDevice(bitmap);
     SkRect rectRed;
     rectRed.setXYWH(30,30,400,700);
     SkPaint paint;
     paint.setColor(SK_ColorRED);
     canvas.drawRect(rectRed,paint);
     ANativeWindow_unlockAndPost(window);
}

次のデバイスでテストしましたが、問題はありませんでした。

  • ソニー X8 (android 2.3.7 カスタマイズ rom)
  • サムスン ネクサス S (アンドロイド 4.0.4)
  • サムスン ギャラクシー タブ 10.1 (アンドロイド 3.2)
  • サムスンギャラクシー S2 (アンドロイド 2.3.5)
  • エミュレーター (Android 4.0.3、Galaxy S3 と同じ画面サイズと dpi)

ANativeWindow_setBuffersGeometry(window,0,0,0) を呼び出してみましたが、うまくいきませんでした (とにかく、ウィンドウ ロック後のバッファーのサイズとフォーマットは問題ないようです)。

これまでのところ、Galaxy S3 だけが問題を抱えています。この時点で、どうすればよいかわかりません。問題が ndk ネイティブ ウィンドウ API にあるのか、skia にあるのか、または関連しているのかさえわかりません。 TouchWizを使用したGalaxy S3...どんなアイデアでも大歓迎です!

4

1 に答える 1

2

あなたはbuffer.stride考慮に入れる必要があります。あなたの写真はあなたが持っていることをはっきりと示していますbuffer.stride != buffer.width

テストすることはできませんが、おそらく次の変更で十分です。

 SkBitmap bitmap;
 SkBitmap::Config cfg = convertPixelFormat(buffer.format);
 bitmap.setConfig(cfg, buffer.width, buffer.height,
       SkBitmap::ComputeBytesPerPixel(cfg) * buffer.stride);
于 2012-06-26T23:55:54.283 に答える