军车耍横:Android的多媒体框架OpenCore介绍(3)

来源:百度文库 编辑:北方网 时间:2020/01/18 05:11:59

第三部分 OpenCore OSCL简介 

    OSCL,全称为Operating System Compatibility Library (操作系统兼容库),它包含了一些在不同操作系统中移植层的功能,其代码结构如下所示:
oscl/oscl
|-- config             :配置的宏
|-- makefile
|-- makefile.pv
|-- osclbase         :包含基本类型、宏以及一些STL容器类似的功能
|-- osclerror        :错误处理的功能
|-- osclio             :文件IOSocket等功能
|-- oscllib            :动态库接口等功能
|-- osclmemory :内存管理、自动指针等功能
|-- osclproc         :线程、多任务通讯等功能
|-- osclregcli        :注册客户端的功能
|-- osclregserv     :注册服务器的功能
`-- osclutil           :字符串等基本功能
         oscl的目录中,一般每一个目录表示一个模块。OSCL对应的功能是非常细致的,几乎对C语言中每一个细节的功能都进行封装,并使用了C++的接口提供给上层使用。事实上,OperCore中的PVMF、Engine部分都在使用OSCL,而整个OperCore的调用者也需要使用OSCL
OSCL的实现中,很多典型的C语言函数被进行了简单的封装,例如:osclutil中与数学相关的功能在oscl_math.inl中被定义成为了内嵌(inline)的函数:
OSCL_COND_EXPORT_REF OSCL_INLINE double oscl_log(double value)
{
         return (double) log(value);
}
OSCL_COND_EXPORT_REF OSCL_INLINE double oscl_log10(double value)
{
         return (double) log10(value);
}
OSCL_COND_EXPORT_REF OSCL_INLINE double oscl_sqrt(double value)
{
         return (double) sqrt(value);
}
         oscl_math.inl文件又被oscl_math.h所包含,因此其结果是oscl_log()等功能的使用等价于原始的log()等函数。

     很多C语言标准库的句柄都被定义成为了C++类的形式,实现由一些繁琐,但是复杂性都不是很高。以oscllib为例,其代码结构如下所示:
oscl/oscl/oscllib/
|-- Android.mk
|-- build
|   `-- make
|       `-- makefile
`-- src
    |-- oscl_library_common.h
    |-- oscl_library_list.cpp
    |-- oscl_library_list.h
    |-- oscl_shared_lib_interface.h
    |-- oscl_shared_library.cpp
    `-- oscl_shared_library.h
        oscl_shared_library.h是提供给上层使用的动态库的接口功能,它定义的接口如下所示:
class OsclSharedLibrary
{
public:
        OSCL_IMPORT_REF OsclSharedLibrary();
        OSCL_IMPORT_REF OsclSharedLibrary(const OSCL_String& aPath);
        OSCL_IMPORT_REF ~OsclSharedLibrary();
        OSCL_IMPORT_REF OsclLibStatus LoadLib(const OSCL_String& aPath);
        OSCL_IMPORT_REF OsclLibStatus LoadLib();
        OSCL_IMPORT_REF void SetLibPath(const OSCL_String& aPath);
        OSCL_IMPORT_REF OsclLibStatus QueryInterface(const OsclUuid& aInterfaceId, OsclAny*& aInterfacePtr);
        OSCL_IMPORT_REF OsclLibStatus Close();
        OSCL_IMPORT_REF void AddRef();
        OSCL_IMPORT_REF void RemoveRef();
}
        这些接口显然都是与库的加载有关系的,而在oscl_shared_library.cpp 中其具体的功能是使用dlopen()等函数来实现的。