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的累!

 

目录
相关文章
|
1月前
|
安全 Android开发 iOS开发
深入探索Android与iOS的差异:从系统架构到用户体验
在当今的智能手机市场中,Android和iOS无疑是最受欢迎的两大操作系统。本文旨在探讨这两个平台之间的主要差异,包括它们的系统架构、开发环境、安全性、以及用户体验等方面。通过对比分析,我们可以更好地理解为何不同的用户群体可能会偏好其中一个平台,以及这些偏好背后的技术原因。
|
1月前
|
IDE Java 开发工具
移动应用与系统:探索Android开发之旅
在这篇文章中,我们将深入探讨Android开发的各个方面,从基础知识到高级技术。我们将通过代码示例和案例分析,帮助读者更好地理解和掌握Android开发。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的信息和技巧。让我们一起开启Android开发的旅程吧!
|
21天前
|
监控 Java Android开发
深入探索Android系统的内存管理机制
本文旨在全面解析Android系统的内存管理机制,包括其工作原理、常见问题及其解决方案。通过对Android内存模型的深入分析,本文将帮助开发者更好地理解内存分配、回收以及优化策略,从而提高应用性能和用户体验。
|
20天前
|
安全 生物认证 Android开发
深入探索iOS与Android操作系统的安全性差异
本文旨在通过对比分析iOS和Android两大主流移动操作系统在安全性方面的差异,揭示它们各自的安全机制、面临的挑战以及用户如何提升自身设备的安全保护。通过对系统架构、应用审核机制、数据加密方式及隐私政策的深入探讨,本文为读者提供了一个全面了解两大平台安全性的视角,并提出了实用的安全建议。
|
22天前
|
存储 安全 Android开发
探索Android系统的最新安全特性
在数字时代,智能手机已成为我们生活中不可或缺的一部分。随着技术的不断进步,手机操作系统的安全性也越来越受到重视。本文将深入探讨Android系统最新的安全特性,包括其设计理念、实施方式以及对用户的影响。通过分析这些安全措施如何保护用户免受恶意软件和网络攻击的威胁,我们希望为读者提供对Android安全性的全面了解。
|
25天前
|
Java 调度 Android开发
安卓与iOS开发中的线程管理差异解析
在移动应用开发的广阔天地中,安卓和iOS两大平台各自拥有独特的魅力。如同东西方文化的差异,它们在处理多线程任务时也展现出不同的哲学。本文将带你穿梭于这两个平台之间,比较它们在线程管理上的核心理念、实现方式及性能考量,助你成为跨平台的编程高手。
|
26天前
|
安全 Android开发 iOS开发
深入探索iOS与Android系统架构差异及其对开发者的影响
本文旨在通过对比分析iOS和Android两大移动操作系统的系统架构,探讨它们在设计理念、技术实现及开发者生态方面的差异。不同于常规摘要仅概述内容要点,本摘要将简要触及核心议题,为读者提供对两大平台架构特点的宏观理解,铺垫
|
28天前
|
安全 Android开发 iOS开发
深入探讨Android与iOS系统的差异及未来发展趋势
本文旨在深入分析Android和iOS两大移动操作系统的核心技术差异、用户体验以及各自的市场表现,进一步探讨它们在未来技术革新中可能的发展方向。通过对比两者的开放性、安全性、生态系统等方面,本文揭示了两大系统在移动设备市场中的竞争态势和潜在变革。
|
29天前
|
API Android开发 iOS开发
深入探索Android与iOS的多线程编程差异
在移动应用开发领域,多线程编程是提高应用性能和响应性的关键。本文将对比分析Android和iOS两大平台在多线程处理上的不同实现机制,探讨它们各自的优势与局限性,并通过实例展示如何在这两个平台上进行有效的多线程编程。通过深入了解这些差异,开发者可以更好地选择适合自己项目需求的技术和策略,从而优化应用的性能和用户体验。
|
29天前
|
IDE 安全 Android开发
深入探索Android与iOS操作系统的架构差异
本文旨在对比分析Android和iOS两大主流移动操作系统在架构设计上的根本差异。通过详细解读两者的系统架构、开发环境、以及安全性等方面,揭示它们各自的特点及优势,为开发者选择合适的平台提供参考。