java - Skia项目运行在Android.4.2上,Android 4.2和Android 2.2中的定义是否存在差异?

标签 java android bitmap android-canvas skia

我尝试在Andorid上显示YUV视频 在Android 2.2版本中,是可以的 然而在 Android 4.2 中屏幕是全黑的

在项目中,我使用JAVA来显示图像的内容 并使用jni读取YUV并将YUV数据返回给JAVA

以下是我的jni代码 #include“SkiaDemoJni.h” #include“mylog.h”

#include "GraphicsJNI.h"
#include "SkPaint.h"
#include "SkCanvas.h"

#include"opj_includes.h"
#include <wchar.h>
#include <android\log.h> 
#include <android\bitmap.h>

#define two_pi (6.283)

unsigned char cur_image_y[101376];
unsigned char cur_image_u[101376];
unsigned char cur_image_v[101376];

inline int32_t color(int32_t pColorY,int32_t pColorU,int32_t pColorV) {
int32_t pColorR;
int32_t pColorG;
 int32_t pColorB;
 pColorR = pColorY+1.4075*(pColorV-128);
 pColorG = pColorY-0.3455*(pColorU-128)-0.7169*(pColorV-128);
 pColorB = pColorY+1.7790*(pColorU-128);
 if(pColorR>255)
  pColorR=255;
 if(pColorG>255)
  pColorG=255;
 if(pColorB>255)
 pColorB=255;   

 if(pColorR<0)
 pColorR=0;
 if(pColorG<0)
 pColorG=0;
 if(pColorB<0)
 pColorB=0;     

 return 0xFF000000 | ((pColorB << 16) & 0x00FF0000) | ((pColorG << 8) & 0x0000FF00) |       
 ((pColorR) & 0x000000FF);
     }
  void Java_com_whtr_example_skiademo_SkiaView_renderHello(JNIEnv *env, jobject thizz,     
  jobject canvas, jint FrameNum,jobject rect)
  {   
  jclass bitmapConfig = env->FindClass("android/graphics/Bitmap$Config");
  jfieldID rgb565FieldID = env->GetStaticFieldID(bitmapConfig, "ARGB_8888",   
  "Landroid/graphics/Bitmap$Config;");
  jobject rgb565Obj = env->GetStaticObjectField(bitmapConfig, rgb565FieldID); 

  jclass bitmapClass = env->FindClass("android/graphics/Bitmap");
  jmethodID createBitmapMethodID = env->GetStaticMethodID(bitmapClass,"createBitmap", 
  "(IILandroid/graphics/Bitmap$Config;)Landroid/graphics/Bitmap;");
  jobject bitmapObj = env->CallStaticObjectMethod(bitmapClass, createBitmapMethodID,  
  352, 288, rgb565Obj);//width,height 
  int a[101376]={0};
  AndroidBitmapInfo   info;   
  int*                pixels;
  int                ret;    
  ret = AndroidBitmap_getInfo(env, bitmapObj, &info);    
  ret = AndroidBitmap_lockPixels(env, bitmapObj, (void**)&pixels);       
  int                width=(int)info.width;  
  int                height=(int)info.height;
  SkBitmap bmp = SkBitmap();  
  bmp.setConfig(SkBitmap::kARGB_8888_Config,width,height);   
  bmp.setPixels((void*)pixels);
  SkCanvas background(bmp);
  SkCanvas* canv = GraphicsJNI::getNativeCanvas(env, canvas);
  if (!canv)
  {
  LOGE("!canv");
  return;
  } 
   systemPara sys;   

  sys.width = 352;

  sys.height = 288;
  sys.frameNO = 1;
  sys.startFrm = 0;
  sys.inFileName = new char[strlen("/mnt/sdcard/out_352x288_P420_final.yuv")+1];
  strcpy(sys.inFileName, "/mnt/sdcard/out_352x288_P420_final.yuv");
  for(int i=0;i<sys.frameNO;i++){
   //sys.startFrm = i;
   YUV_play_read(cur_image_y, cur_image_u, cur_image_v, sys.inFileName, sys.width, sys.height, FrameNum);
   for(int x=0;x<sys.width;x++){
    for(int y=0;y<sys.height;y++){
        a[x + y * 352] = color(cur_image_y[x + y * 352], cur_image_u[x + y * 352], cur_image_v[x + y *   352]);
    }
   }
  }  
  pixels = a;
  AndroidBitmap_unlockPixels(env, bitmapObj);
  bmp.setPixels((void*)pixels);
  canv->drawBitmap(bmp, 0, 0, NULL);

 }

最佳答案

您需要确保您没有使用硬件渲染,方法是:

  1. 调用 view.setLayerType(LAYER_TYPE_SOFTWARE, null);或者在 AndroidManifest.xml 的应用程序部分设置 android:hardwareAccelerated="false"

  2. 转到开发者选项,然后取消选中“强制 GPU 渲染”

关于java - Skia项目运行在Android.4.2上,Android 4.2和Android 2.2中的定义是否存在差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20471450/

相关文章:

java - 用于生成 Groovy 源文件的 Java/Groovy API

java - 不知何故,在递归过程中,对象在 list.add(object) 之后发生了变异。解释?

android - canvas.setBitmap(bitmap) 在模拟器中有效,但在手机上无效

java - 从文件路径将位图设置为 imageview 不起作用

java - BitmapFactory : Unable to decode stream: java. io.FileNotFoundException:打开失败:ENOENT(没有这样的文件或目录)

java - 如何在 Spring Integration 中动态添加队列以进行交换

java - Selenium WebDriver 在切换前获取当前帧

java - ActionBar 刷新按钮

java - Android,处理关闭游标

android - 如何从 Firebase 获取时间戳?安卓