ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
我们在external目录中建立一个C++应用程序lightpointer来说明轻量级指针的使用方法,它的目录结构如下: ~~~ ~/Android ----external ----lightpointer ----lightpointer.cpp ----Android.mk ~~~ 应用程序lightpointer的实现很简单,它只有一个源文件lightpointer.cpp和一个编译脚本文件Android.mk。下面我们就分别介绍它们的内容。 **lightpointer.cpp** ~~~ #include <stdio.h> #include <utils/RefBase.h> using namespace android; class LightClass : public LightRefBase<LightClass> { public: LightClass() { printf("Construct LightClass Object."); } virtual ~LightClass() { printf("Destroy LightClass Object."); } }; int main(int argc, char** argv) { LightClass* pLightClass = new LightClass(); sp<LightClass> lpOut = pLightClass; printf("Light Ref Count: %d.\n", pLightClass->getStrongCount()); { sp<LightClass> lpInner = lpOut; printf("Light Ref Count: %d.\n", pLightClass->getStrongCount()); } printf("Light Ref Count: %d.\n", pLightClass->getStrongCount()); return 0; } ~~~ 这个文件创建了一个继承了LightRefBase类的LightClass类,因此,LightClass类的对象能够结合轻量级指针来使用。 在应用程序lightpointer的入口函数main中,首先创建了一个LightClass对象pLightClass,然后再创建一个轻量级指针lpOut来引用它。在轻量级指针lpOut的创建过程中,会调用sp类的构造函数来增加LightClass对象pLightClass的引用计数,即此时LightClass对象pLightClass的引用计数值为1,因此,第25行的printf语句打印出来的数字就应该等于1。在第27行到第31行代码中,我们在一个内嵌的作用域中创建了另外一个轻量级指针lpInner来引用LightClass对象pLightClass,此时LightClass对象pLightClass的引用计数值会再增加1,因此,第30行的printf语句打印出来的数字就应该等于2。当应用程序lightpointer跳出了第27行到第31行的作用域之后,轻量级指针lpInner就被析构了,这时候LightClass对象pLightClass的引用计数值就会减少1,因此,第33行的printf语句打印出来的数字就应该等于1。当应用程序lightpointer执行完成之后,轻量级指针lpOut也会被析构,这时候LightClass对象pLightClass的引用计数值就会再次减少1,即等于0,于是LightClass对象pLightClass就会被释放。 **Android.mk** ~~~ LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE_TAGS := optional LOCAL_MODULE := lightpointer LOCAL_SRC_FILES := lightpointer.cpp LOCAL_SHARED_LIBRARIES := \ libcutils \ libutils include $(BUILD_EXECUTABLE) ~~~ 这是应用程序lightpointer的编译脚本文件,它引用了libcutils和libutils两个库。 上述两个文件准备好了之后,我们就可以对这个C++工程进行编译和打包了。 ~~~ USER@MACHINE:~/Android$ mmm ./external/lightpointer/ USER@MACHINE:~/Android$ make snod ~~~ 编译成功之后,就可以在out/target/product/gerneric/system/bin目录下看到应用程序文件lightpointer了;打包成功之后,该应用程序就包含在out/target/product/gerneric目录下的Android系统镜像文件system.img中了。 最后,我们使用新得到的系统镜像文件system.img来启动Android模拟器。Android模拟器启动起来之后,使用adb工具连接上它,并且进入到/system/bin目录中,运行应用程序lightpointer来查看它的输出,从而验证轻量级指针的实现原理。 ~~~ USER@MACHINE: ~/Android$ emulator & USER@MACHINE:~/Android$ adb shell root@android:/ # cd system/bin/ root@android:/system/bin # ./lightpointer Construct LightClass Object. Light Ref Count: 1. Light Ref Count: 2. Light Ref Count: 1. Destory LightClass Object. ~~~ 如果能看到上面的输出,就说明我们前面对轻量级指针的实现原理的分析是正确的。