Android中采用JNI对Bitmap进行处理,比Canvas处理快85倍左右。
2016-01-06 13:10
585 查看
本文对JNI和Canvas的Bitmap操作进行测试,将一幅1920*1080 Argb8888中的像素快拷贝到另一幅1920*1080 Argb8888的图像上。
使用小米3,Android4.4.4版本。采用Canvas方式:
Bitmap btm1=Bitmap.createBitmap(1920,1080,Config.ARGB_8888); btm1.eraseColor(Color.GREEN); Bitmap btm2=Bitmap.createBitmap(1920,1080,Config.ARGB_8888); btm2.eraseColor(Color.BLUE); Canvas cv=new Canvas(btm1); long start=System.nanoTime(); for(int i=0;i<1000;i++) { cv.drawBitmap(btm2, new Rect(i, i, i+30,i+30), new Rect(i, i, i+80,i+80), null); } cv.save(Canvas.ALL_SAVE_FLAG); cv.restore(); long stop=System.nanoTime(); Toast.makeText(getApplication(), "time:"+(stop-start)/1000000+"ms", Toast.LENGTH_LONG).show();
耗时84ms。
采用JNI方式
JNIEXPORT jobject JNICALL Java_com_ks_testndk_JNITest_getBitmap(JNIEnv *env, jobject jObject, jintArray points, jobject globalBtm, jobject lastBtm) { void * pixelsG = NULL; void * pixelsL=NULL; int resG = AndroidBitmap_lockPixels(env, globalBtm, &pixelsG); int resL = AndroidBitmap_lockPixels(env, lastBtm, &pixelsL); if (pixelsG == NULL || pixelsL==NULL) { LOGD("fail to lock bitmap: %d,%d\n", resG,resL); return NULL; } AndroidBitmapInfo info; memset(&info, 0, sizeof(info)); AndroidBitmap_getInfo(env, globalBtm, &info); uint32_t* whereToFrom; uint32_t* whereToPut; jint *carr = env->GetIntArrayElements(points, NULL); jsize size=env->GetArrayLength(points); for(int i=0;i<size;i+=4) { int xPoint=carr[i]; int yPoint=carr[i+1]; int width=carr[i+2]; int height=carr[i+3]; //LOGD("xpoint: %d ,yPoint: %d, width: %d,height: %d",xPoint,yPoint,width,height); whereToFrom=(uint32_t*)pixelsG+yPoint*info.width+xPoint; whereToPut=(uint32_t*)pixelsL+yPoint*info.width+xPoint; for(int j=0;j<height;j++) { memcpy(whereToFrom, whereToPut,sizeof(uint32_t) * width); whereToFrom+=info.width; whereToPut+=info.width; } } AndroidBitmap_unlockPixels(env, globalBtm); AndroidBitmap_unlockPixels(env, lastBtm); return NULL; }
耗时:1ms。
可见,对密集型数据处理还是得使用JNI形式操作,特别是在做远程控制系统的时候,要对服务端发来的差异桌面图像进行复原,就更要采用JNI形式,保证快速恢复图像。
相关文章推荐
- 本地导入Android-PullToRefresh库问题解决
- Android系统源码下载
- Android材料设计第一篇
- 1.1 Android环境准备有哪些
- Android进阶之性能优化
- Android:TabHost
- 在Android上实现多进程构架的浏览器(浏览器开发)的讨论
- Android:ListView数据的分批加载
- Android系统之路(初识MTK) ------ 客制化开机LOGO跟开机动画/系统默认壁纸
- Android实现打电话和发短信
- Android:ListView数据异步加载、Handler、AsyncTask
- ArrayList 扩容 Android Java 真的不一样
- FindBugs-AndroidStudio代码错误自动检查插件
- 关于应用打开word、pdf
- Android导入外部数据库
- Android 视图框架系列2/3——SurfaceView视图框架
- 1.0 Android学习路线简要介绍
- Android SQLite服务--创建、增删改查
- 获取APK的签名MD5值
- 开发基于高德SDK的Android车载导航应用