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

 

目录
相关文章
|
6天前
|
IDE Android开发 iOS开发
探索Android与iOS开发的差异:平台选择对项目成功的影响
【9月更文挑战第27天】在移动应用开发的世界中,Android和iOS是两个主要的操作系统平台。每个系统都有其独特的开发环境、工具和用户群体。本文将深入探讨这两个平台的关键差异点,并分析这些差异如何影响应用的性能、用户体验和最终的市场表现。通过对比分析,我们将揭示选择正确的开发平台对于确保项目成功的重要作用。
|
8天前
|
IDE Android开发 iOS开发
深入解析Android与iOS的系统架构及开发环境差异
本文旨在探讨Android和iOS两大主流移动操作系统在系统架构、开发环境和用户体验方面的显著差异。通过对比分析,我们将揭示这两种系统在设计理念、技术实现以及市场策略上的不同路径,帮助开发者更好地理解其特点,从而做出更合适的开发决策。
36 2
|
14天前
|
安全 Android开发 数据安全/隐私保护
探索安卓与iOS的安全性差异:一场永无止境的较量
在移动操作系统的世界中,安卓(Android)和iOS一直是备受关注的两大巨头。它们不仅在市场份额、用户体验和功能特性上竞争激烈,还在安全性这一关键领域展开了激烈的角逐。本文将深入探讨安卓与iOS在安全性方面的不同之处,分析两者在应对安全威胁时的策略和技术手段,并展望未来移动操作系统安全的发展趋势。通过对比分析,我们将揭示这场永无止境的较量中,究竟谁能更胜一筹,以及用户又该如何在两者之间做出明智的选择。
35 0
|
7天前
|
安全 Android开发 数据安全/隐私保护
探索安卓与iOS的安全性差异:技术深度分析与实践建议
本文旨在深入探讨并比较Android和iOS两大移动操作系统在安全性方面的不同之处。通过详细的技术分析,揭示两者在架构设计、权限管理、应用生态及更新机制等方面的安全特性。同时,针对这些差异提出针对性的实践建议,旨在为开发者和用户提供增强移动设备安全性的参考。
|
10天前
|
监控 Android开发 iOS开发
深入探索安卓与iOS的系统架构差异:理解两大移动平台的技术根基在移动技术日新月异的今天,安卓和iOS作为市场上最为流行的两个操作系统,各自拥有独特的技术特性和庞大的用户基础。本文将深入探讨这两个平台的系统架构差异,揭示它们如何支撑起各自的生态系统,并影响着全球数亿用户的使用体验。
本文通过对比分析安卓和iOS的系统架构,揭示了这两个平台在设计理念、安全性、用户体验和技术生态上的根本区别。不同于常规的技术综述,本文以深入浅出的方式,带领读者理解这些差异是如何影响应用开发、用户选择和市场趋势的。通过梳理历史脉络和未来展望,本文旨在为开发者、用户以及行业分析师提供有价值的见解,帮助大家更好地把握移动技术发展的脉络。
|
6天前
|
Dart 开发工具 Android开发
在 Android 系统上搭建 Flutter 环境的具体步骤是什么?
在 Android 系统上搭建 Flutter 环境的具体步骤是什么?
|
14天前
|
安全 Linux Android开发
探索安卓与iOS的安全性差异:技术深度分析
本文深入探讨了安卓(Android)和iOS两个主流操作系统平台在安全性方面的不同之处。通过比较它们在架构设计、系统更新机制、应用程序生态和隐私保护策略等方面的差异,揭示了每个平台独特的安全优势及潜在风险。此外,文章还讨论了用户在使用这些设备时可以采取的一些最佳实践,以增强个人数据的安全。
|
18天前
|
安全 Android开发 数据安全/隐私保护
探索安卓与iOS的安全性差异:一场永无止境的较量
在移动操作系统的领域中,安卓(Android)和iOS一直以其独特的安全性特性引领着市场。本文深入探讨了两者在安全性方面的不同之处,从系统架构、隐私保护到应用生态,一一剖析双方的优势与不足。通过对比分析,我们将揭示这场看似平静却暗流涌动的安全较量,展现一个全面而细致的对比视角。同时,我们也期待这场竞争能进一步推动整个行业安全标准和技术的进步,为用户带来更加安心、便捷的移动体验。
32 1
|
23天前
|
开发框架 Android开发 iOS开发
探索安卓与iOS开发的差异:构建未来应用的指南
在移动应用开发的广阔天地中,安卓与iOS两大平台各占半壁江山。本文将深入浅出地对比这两大操作系统的开发环境、工具和用户体验设计,揭示它们在编程语言、开发工具以及市场定位上的根本差异。我们将从开发者的视角出发,逐步剖析如何根据项目需求和目标受众选择适合的平台,同时探讨跨平台开发框架的利与弊,为那些立志于打造下一个热门应用的开发者提供一份实用的指南。
47 5
|
23天前
|
开发工具 Android开发 Swift
探索安卓与iOS开发的差异:从新手到专家的旅程
在数字时代的浪潮中,移动应用开发已成为连接世界的桥梁。本文将深入探讨安卓与iOS这两大主流平台的开发差异,带领读者从零基础出发,逐步了解各自的特点、开发环境、编程语言及市场策略。无论你是梦想成为移动应用开发者的初学者,还是希望扩展技能边界的资深开发者,这篇文章都将为你提供宝贵的见解和实用的建议。
下一篇
无影云桌面