您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 市场营销 > Mstar理论及实践篇
理论篇###############################################################################spITvManagerTvManager::mTvManager;强指针sp智能指针在Android的源代码中,经常会看到形如:spxxx、wpxxx这样的类型定义,这其实是Android中的智能指针。智能指针是C++中的一个概念,通过基于引用计数的方法,解决对象的自动释放的问题。在C++编程中,有两个很让人头痛的问题:一是忘记释放动态申请的对象从而造成内存泄露;二是对象在一个地方释放后,又在别的地方被使用,从而引起内存访问错误。程序员往往需要花费很大精力进行精心设计,以避免这些问题的出现。在使用智能指针后,动态申请的内存将会被自动释放(有点类似Java的垃圾回收),不需要再使用delete来释放对象,也不需要考虑一个对象是否已经在其它地方被释放了,从而使程序编写工作减轻不少,而程序的稳定性大大提高。Android的智能指针相关的源代码在下面两个文件中:frameworks/base/include/utils/RefBase.hframeworks/base/libs/utils/RefBase.cpp涉及的类以及类之间的关系如下图所示:Android中定义了两种智能指针类型,一种是强指针sp(strongpointer),一种是弱指针(weakpointer)。其实成为强引用和弱引用更合适一些。强指针与一般意义的智能指针概念相同,通过引用计数来记录有多少使用者在使用一个对象,如果所有使用者都放弃了对该对象的引用,则该对象将被自动销毁。弱指针也指向一个对象,但是弱指针仅仅记录该对象的地址,不能通过弱指针来访问该对象,也就是说不能通过弱智真来调用对象的成员函数或访问对象的成员变量。要想访问弱指针所指向的对象,需首先将弱指针升级为强指针(通过wp类所提供的promote()方法)。弱指针所指向的对象是有可能在其它地方被销毁的,如果对象已经被销毁,wp的promote()方法将返回空指针,这样就能避免出现地址访问错的情况。是不是很神奇?弱指针是怎么做到这一点的呢?其实说穿了一点也不复杂,原因就在于每一个可以被智能指针引用的对象都同时被附加了另外一个weakref_impl类型的对象,这个对象中负责记录对象的强指针引用计数和弱指针引用计数。这个对象是智能指针的实现内部使用的,智能指针的使用者看不到这个对象。弱指针操作的就是这个对象,只有当强引用计数和弱引用计数都为0时,这个对象才会被销毁。说了这么多原理,下面该看看到底智能指针该怎么使用了。假设现在有一个类MyClass,如果要使用智能指针来引用这个类的对象,那么这个类需满足下列两个前提条件:(1)这个类是基类RefBase的子类或间接子类;(2)这个类必须定义虚构造函数,即它的构造函数需要这样定义:virtual~MyClass();满足了上述条件的类就可以定义智能指针了,定义方法和普通指针类似。比如普通指针是这样定义:MyClass*p_obj;智能指针是这样定义:spMyClassp_obj;注意不要定义成spMyClass*p_obj。初学者容易犯这种错误,这样实际上相当于定义了一个指针的指针。尽管在语法上没有问题,但是最好永远不要使用这样的定义。定义了一个智能指针的变量,就可以象普通指针那样使用它,包括赋值、访问对象成员、作为函数的返回值、作为函数的参数等。比如:p_obj=newMyClass();//注意不要写成p_obj=newspMyClassspMyClassp_obj2=p_obj;p_obj-func();p_obj=create_obj();some_func(p_obj);注意不要试图delete一个智能指针,即deletep_obj。不要担心对象的销毁问题,智能指针的最大作用就是自动销毁不再使用的对象。不需要再使用一个对象后,直接将指针赋值为NULL即可:p_obj=NULL;上面说的都是强指针,弱指针的定义方法和强指针类似,但是不能通过弱指针来访问对象的成员。下面是弱指针的示例:wpMyClasswp_obj=newMyClass();p_obj=wp_obj.promote();//升级为强指针。不过这里要用.而不是-,真是有负其指针之名啊wp_obj=NULL;智能指针用起来是很方便,在一般情况下最好使用智能指针来代替普通指针。但是需要知道一个智能指针其实是一个对象,而不是一个真正的指针,因此其运行效率是远远比不上普通指针的。所以在对运行效率敏感的地方,最好还是不要使用智能指针为好。###############################################################################认识理解Java中native方法[摘要]Java不是完美的,Java的不足除了体现在运行速度上要比传统的C++慢许多之外,Java无法直接访问到操作系统底层(如系统硬件等),为此Java使用native方法来扩展Java程序的功能。[关键字]JavanativeJava不是完美的,Java的不足除了体现在运行速度上要比传统的C++慢许多之外,Java无法直接访问到操作系统底层(如系统硬件等),为此Java使用native方法来扩展Java程序的功能。可以将native方法比作Java程序同C程序的接口,其实现步骤:1、在Java中声明native()方法,然后编译;2、用javah产生一个.h文件;3、写一个.cpp文件实现native导出方法,其中需要包含第二步产生的.h文件(注意其中又包含了JDK带的jni.h文件);4、将第三步的.cpp文件编译成动态链接库文件;5、在Java中用System.loadLibrary()方法加载第四步产生的动态链接库文件,这个native()方法就可以在Java中被访问了。JAVA本地方法适用的情况1.为了使用底层的主机平台的某个特性,而这个特性不能通过JAVAAPI访问2.为了访问一个老的系统或者使用一个已有的库,而这个系统或这个库不是用JAVA编写的3.为了加快程序的性能,而将一段时间敏感的代码作为本地方法实现。首先写好JAVA文件/**Createdon2005-12-19Authorshaoqi*/packagecom.hode.hodeframework.modelupdate;publicclassCheckFile{publicnativevoiddisplayHelloWorld();static{System.loadLibrary(test);}publicstaticvoidmain(String[]args){newCheckFile().displayHelloWorld();}}然后根据写好的文件编译成CLASS文件然后在classes或bin之类的class根目录下执行javah-jnicom.hode.hodeframework.modelupdate.CheckFile,就会在根目录下得到一个com_hode_hodeframework_modelupdate_CheckFile.h的文件然后根据头文件的内容编写com_hode_hodeframework_modelupdate_CheckFile.c文件#includeCheckFile.h#include#includeJNIEXPORTvoidJNICALLJava_com_hode_hodeframework_modelupdate_CheckFile_displayHelloWorld(JNIEnv*env,jobjectobj){printf(Helloworld!\n);return;}之后编译生成DLL文件如“test.dll”,名称与System.loadLibrary(test)中的名称一致vc的编译方法:cl-I%java_home%\include-I%java_home%\include\win32-LDcom_hode_hodeframework_modelupdate_CheckFile.c-Fetest.dll最后在运行时加参数-Djava.library.path=[dll存放的路径]###############################################################################MStarAndroid网络机代码组成从代码结构上分,MStarAndroid网络电视包含MBoot、PM、Kernel、Supernova、ICS、TvApp和LocalMM这7个部分,以MSD6A801的代码包为例,如图所示:上面7个部分跟Android架构的关系图:下面针对这7个模块进行详细描述,内容主要涉及启动流程和代码结构等,最后将对各模块的相互关联做个总结。MBoot概述MBoot是MStarBootLoader的缩写,由SBoot和UBoot两部分组成。MBoot用于系统的启动引导,它会初始化硬件,然后从NANDflash加载Linux内核(kernel)和应用程序(applications)到DRAM。(说明:其实标准的UBoot程序已经做了MBoot的全部工作,MStar引入SBoot的概念,是沿用了MStar非网络机的用法)以下是上面提到的几个名词的对比:AcronymDescriptionMBootMStarBootloaderSBootSmallBootloaderUBootUniversalBootloaderMBoot存储在flash,该flash一般采用16M/32Mbit容量的spiflash,里面存放系统的引导程序及部分系统、用户数据。系统上电后首先通过Mboot引导启动,Mboot完成启动后再启动系统主程序。系统的主程序存放在NANDFlash中。不管是spiflash还是Nandflash,任何一个有故障,都会导致整机无法启动。MBoot主要包含sboot和uboot两部分:说明:标准的GPLUBoot代码放在目录u-boot-1.1.6里面,经过MStar移植的UBoot代码放在u-boot-2011.06。SBoot介绍SBoot代码结构树SBoot是MBoot启动系统的入口点,用于初始化CPU(ARMv7),Cache,寄存器等。初始化工作完成后,MBoot将跳到UBoot的入口点。SBoot的目录结构主要包括下面子目录:bin,inc,scripts,out,src。bin:存放PM.bin,关于PM在后面会介绍;inc:board文件,如MSD6A608对应的BD_MST038B_10AHT_EAGLE.h;scripts:存放脚本文件,用于配置相关参数,即输入makemenuconfig后弹出的menuconfigurationwindow;out:存放MBoot编译生成的bin;src:SBoot的源代码.SBoot启动流程启动入口和地址在sboot.lds(lds文件是决定一个可执行程序的各个段的存储位置,以及入口地址,这也是链接定位的作用)文件里描述:下面以MSD6A608为例进行说明:入口点即ENTRY(_vector),在/sboot/src/eagle/boot.S有实现代码,boot.S会生成对应的boot.o;启动地址:0x00000000;Ram的地址,这里的Ram指的是DSPRam;需要注意的是,启动代码即boot.o应该放在第一个section上并且boot.o不能大于8Kbytes。如下是SBoot的section定义,同样在/sboot/src/eagle/sboot.lds里能找到实现。入口Entry执行完后,执行/sboot/src/eagle/bootrom.S,这一步进行寄存器设置,注意一点是,这一步还会进行Uart的
本文标题:Mstar理论及实践篇
链接地址:https://www.777doc.com/doc-4830596 .html