surface在android4.2跟4.4系统中本地service里使用上的差异

简介: surface在android4.2跟4.4系统中本地service里使用上的差异        了解android的人都知道,android的应用是java写的,运行的效率应该比C/C++要低一些,这是不争的事实。

surface在android4.2跟4.4系统中本地service里使用上的差异

 

       了解android的人都知道,android的应用是java写的,运行的效率应该比C/C++要低一些,这是不争的事实。为了提高运行效率,运算量大的任务大多都是采用本地service的形式存在,比如我们比较熟悉的audiofliger、surfacefliger,都是采用本地service的形式做的。笔者的研发项目中,使用到了视频输入,鉴于一些运算量运行效率考虑,也是采用本地service的形式来完成的,我们暂且认为这个本地service的名字就是“media.tvd”吧。

   在“media.tvd”中肯定需要做一下surface相关的传递,以供视频数据能够跟这个surface的window挂上钩,再通过surfacefliger显示出来。笔者在4.2上使用的这个相关接口如下:

status_t     setPreviewDisplay(constsp<Surface>& surface);

我们在creatSurface后会得到一个surface的对象,如果是app调用这个接口就是通过JNIcall下来的,JNI传递surface是没有问题。

/*****************************************************************************************************/
声明:本博内容均由http://blog.csdn.net/edsam49原创,转载请注明出处,谢谢!
/*****************************************************************************************************/

   我们先来回顾一下android4.2surface里面有两个非常重要的接口,也就是下面这个两个;

    static status_t writeToParcel(const sp<Surface>& control, Parcel* parcel);

    static sp<Surface> readFromParcel(const Parcel& data);

      所以在4.2系统里,如果要传surface,我们可以通过这两个接口就完成了client到server的传递。但是到4.4系统surface已经发生了很大变化,已经没有这两个接口了,那怎么完成client到server的传递呢?

      笔者刚开始也很郁闷,4.2都用得好好的,移植到4.4编译都过不了,哎!有什么办法呢,工作总是要继续的,生活也是要继续的。在网上也找了一些资料看了,基本上没有找到什么有价值的东西,所以笔者还是从源码中来,到源码中去,静下心来看看4.4系统的相关源码。笔者首先想到了camera系统也是一个本地service,那它同样也存在同样的需求吧。Camera这一块的代码也不少啊!不熟悉的话,也是要折腾一下的。

      上周晚上笔者自己在家看源码,晚上11点多了,把camera相关的看了后,得到了启发,信心立马上来了,解决问题有戏了。如果把“media.tvd”写成lib的形式,当然也是可以的,这样做得好会牺牲一些效率,关键是也要裁剪代码,调试,也不那么方便了,所以笔者还是先坚持用“media.tvd”本地service的形式继续推进。

      在android4.4系统中,确实不能直接传surface了,但是新增了一个好东西,也就是IGraphicBufferProducer,按意思也就是图形buffer的生产者了。笔者把以前穿surface的地方都改成传IGraphicBufferProducer就行了。当然在client调用的使用要从surface转一下到IGraphicBufferProducer,surface里面有这样的接口,如下:

sp<IGraphicBufferProducer>  gbp

gbp =mFlingerSurface->getIGraphicBufferProducer();

     这样就把这个gbp传递下去就是了,那么到service实体部分,需要做一些变通,反正后面的目的就是得到一个ANativeWindow的对象,代码如下:

+status_t TVDecoderService::setPreviewDisplay(const sp<IGraphicBufferProducer>& bufferProducer)
 {
     int ret = OK;
  //   sp<IBinder> binder(surface != 0 ? surface->asBinder() : 0);
-    sp<ANativeWindow> window(surface);
+ ALOGD("setPreviewTarget(%p) (pid %d)", bufferProducer.get(),
+		 getCallingPid());
+ 
+ sp<IBinder> binder;
+ sp<ANativeWindow> window;
+ if (bufferProducer != 0) {
+	 binder = bufferProducer->asBinder();
+	 // Using controlledByApp flag to ensure that the buffer queue remains in
+	 // async mode for the old camera API, where many applications depend
+	 // on that behavior.
+	 window = new Surface(bufferProducer, /*controlledByApp*/ true);
+ }
+
+//    sp<ANativeWindow> window(surface);
     mPreviewWindow = window;

    中间的一些部分传递都是比较简单的,笔者就不介绍了,重要的就是找到这么一条通路。每次android系统版本的升级,都会带来很多已经完成的工作重新研究实现的问题,这也是做android比较累的地方,当然想要android的好,得包容android的累!

 

目录
相关文章
|
5月前
|
Linux 测试技术 语音技术
【车载Android】模拟Android系统的高负载环境
本文介绍如何将Linux压力测试工具Stress移植到Android系统,用于模拟高负载环境下的CPU、内存、IO和磁盘压力,帮助开发者优化车载Android应用在多任务并发时的性能问题,提升系统稳定性与用户体验。
415 6
|
5月前
|
Java 数据库 Android开发
基于Android的电子记账本系统
本项目研究开发一款基于Java与Android平台的开源电子记账系统,采用SQLite数据库和Gradle工具,实现高效、安全、便捷的个人财务管理,顺应数字化转型趋势。
|
10月前
|
安全 搜索推荐 Android开发
Android系统SELinux安全机制详解
如此看来,SELinux对于大家来说,就像那位不眠不休,严阵以待的港口管理员,守护我们安卓系统的平安,维护这片海港的和谐生态。SELinux就这样,默默无闻,却卫士如山,给予Android系统一份厚重的安全保障。
349 18
|
存储 安全 Android开发
探索Android系统的最新安全特性
在数字时代,智能手机已成为我们生活中不可或缺的一部分。随着技术的不断进步,手机操作系统的安全性也越来越受到重视。本文将深入探讨Android系统最新的安全特性,包括其设计理念、实施方式以及对用户的影响。通过分析这些安全措施如何保护用户免受恶意软件和网络攻击的威胁,我们希望为读者提供对Android安全性的全面了解。
|
安全 生物认证 Android开发
深入探索iOS与Android操作系统的安全性差异
本文旨在通过对比分析iOS和Android两大主流移动操作系统在安全性方面的差异,揭示它们各自的安全机制、面临的挑战以及用户如何提升自身设备的安全保护。通过对系统架构、应用审核机制、数据加密方式及隐私政策的深入探讨,本文为读者提供了一个全面了解两大平台安全性的视角,并提出了实用的安全建议。
|
开发工具 Android开发 iOS开发
Android与iOS生态差异深度剖析:技术架构、开发体验与市场影响####
本文旨在深入探讨Android与iOS两大移动操作系统在技术架构、开发环境及市场表现上的核心差异,为开发者和技术爱好者提供全面的视角。通过对比分析,揭示两者如何塑造了当今多样化的移动应用生态,并对未来发展趋势进行了展望。 ####
|
监控 Java Android开发
深入探索Android系统的内存管理机制
本文旨在全面解析Android系统的内存管理机制,包括其工作原理、常见问题及其解决方案。通过对Android内存模型的深入分析,本文将帮助开发者更好地理解内存分配、回收以及优化策略,从而提高应用性能和用户体验。
|
Java 调度 Android开发
安卓与iOS开发中的线程管理差异解析
在移动应用开发的广阔天地中,安卓和iOS两大平台各自拥有独特的魅力。如同东西方文化的差异,它们在处理多线程任务时也展现出不同的哲学。本文将带你穿梭于这两个平台之间,比较它们在线程管理上的核心理念、实现方式及性能考量,助你成为跨平台的编程高手。
|
安全 Android开发 iOS开发
深入探索iOS与Android系统架构差异及其对开发者的影响
本文旨在通过对比分析iOS和Android两大移动操作系统的系统架构,探讨它们在设计理念、技术实现及开发者生态方面的差异。不同于常规摘要仅概述内容要点,本摘要将简要触及核心议题,为读者提供对两大平台架构特点的宏观理解,铺垫
|
安全 Android开发 iOS开发
深入探讨Android与iOS系统的差异及未来发展趋势
本文旨在深入分析Android和iOS两大移动操作系统的核心技术差异、用户体验以及各自的市场表现,进一步探讨它们在未来技术革新中可能的发展方向。通过对比两者的开放性、安全性、生态系统等方面,本文揭示了两大系统在移动设备市场中的竞争态势和潜在变革。

热门文章

最新文章