没有合适的资源?快使用搜索试试~ 我知道了~
首页Mstar理论及实践篇参考.pdf
资源详情
资源评论
资源推荐

理论篇
###############################################################################
sp<ITvManager> TvManager::mTvManager; 强指针 sp
智能指针
在 Android 的源代码中,经常会看到形如:sp<xxx>、wp<xxx>这样的类型定义,这其实是
Android 中的智能指针。智能指针是 C++中的一个概念,通过基于引用计数的方法,解决对
象的自动释放的问题。在 C++编程中,有两个很让人头痛的问题:一是忘记释放动态申请
的对象从而造成内存泄露;二是对象在一个地方释放后,又在别的地方被使用,从而引起内
存访问错误。程序员往往需要花费很大精力进行精心设计,以避免这些问题的出现。在使用
智能指针后,动态申请的内存将会被自动释放(有点类似 Java 的垃圾回收),不需要再使
用 delete 来释放对象,也不需要考虑一个对象是否已经在其它地方被释放了,从而使程序
编写工作减轻不少,而程序的稳定性大大提高。
Android 的智能指针相关的源代码在下面两个文件中:
frameworks/base/include/utils/RefBase.h
frameworks/base/libs/utils/RefBase.cpp
涉及的类以及类之间的关系如下图所示:
Android 中定义了两种智能指针类型,一种是强指针 sp(strong pointer),一种是弱指
针(weak pointer)。其实成为强引用和弱引用更合适一些。强指针与一般意义的智能指针
概念相同,通过引用计数来记录有多少使用者在使用一个对象,如果所有使用者都放弃了对
该对象的引用,则该对象将被自动销毁。
弱指针也指向一个对象,但是弱指针仅仅记录该对象的地址,不能通过弱指针来访问该
对象,也就是说不能通过弱智真来调用对象的成员函数或访问对象的成员变量。要想访问弱
指针所指向的对象,需首先将弱指针升级为强指针(通过 wp 类所提供的 promote()方法)。
弱指针所指向的对象是有可能在其它地方被销毁的,如果对象已经被销毁,wp 的 promote()
方法将返回空指针,这样就能避免出现地址访问错的情况。
是不是很神奇?弱指针是怎么做到这一点的呢?其实说穿了一点也不复杂,原因就在于
每一个可以被智能指针引用的对象都同时被附加了另外一个 weakref_impl 类型的对象,这

个对象中负责记录对象的强指针引用计数和弱指针引用计数。这个对象是智能指针的实现内
部使用的,智能指针的使用者看不到这个对象。弱指针操作的就是这个对象,只有当强引用
计数和弱引用计数都为 0 时,这个对象才会被销毁。
说了这么多原理,下面该看看到底智能指针该怎么使用了。假设现在有一个类 MyClass,
如果要使用智能指针来引用这个类的对象,那么这个类需满足下列两个前提条件:
(1) 这个类是基类 RefBase 的子类或间接子类;
(2) 这个类必须定义虚构造函数,即它的构造函数需要这样定义:
virtual ~MyClass();
满足了上述条件的类就可以定义智能指针了,定义方法和普通指针类似。比如普通指针
是这样定义:
MyClass* p_obj;
智能指针是这样定义:
sp<MyClass> p_obj;
注意不要定义成 sp<MyClass>* p_obj。初学者容易犯这种错误,这样实际上相当于定义
了一个指针的指针。尽管在语法上没有问题,但是最好永远不要使用这样的定义。
定义了一个智能指针的变量,就可以象普通指针那样使用它,包括赋值、访问对象成员、
作为函数的返回值、作为函数的参数等。比如:
p_obj = new MyClass(); // 注意不要写成 p_obj = new sp<MyClass>
sp<MyClass> p_obj2 = p_obj;
p_obj->func();
p_obj = create_obj();
some_func(p_obj);
注意不要试图 delete 一个智能指针,即 delete p_obj。不要担心对象的销毁问题,智能
指针的最大作用就是自动销毁不再使用的对象。不需要再使用一个对象后,直接将指针赋值
为 NULL 即可:

p_obj = NULL;
上面说的都是强指针,弱指针的定义方法和强指针类似,但是不能通过弱指针来访问对
象的成员。下面是弱指针的示例:
wp<MyClass> wp_obj = new MyClass();
p_obj = wp_obj.promote(); // 升级为强指针。不过这里要用.而不是->,真是有负其指针
之名啊
wp_obj = NULL;
智能指针用起来是很方便,在一般情况下最好使用智能指针来代替普通指针。但是需要
知道一个智能指针其实是一个对象,而不是一个真正的指针,因此其运行效率是远远比不上
普通指针的。所以在对运行效率敏感的地方,最好还是不要使用智能指针为好。
###############################################################################
认识理解 Java 中 native 方法
[摘要] Java 不是完美的,Java 的不足除了体现在运行速度上要比传统的 C++慢许多之外,Java 无法直接访
问到操作系统底层(如系统硬件等),为此 Java 使用 native 方法来扩展 Java 程序的功能。
[关键字] Java native
Java
不是完美的,
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.
为了使用底层的主机平台的某个特性,而这个特性不能通过
JAVA API
访问
2.
为了访问一个老的系统或者使用一个已有的库,而这个系统或这个库不是用
JAVA
编
写的
3.
为了加快程序的性能,而将一段时间敏感的代码作为本地方法实现。
首先写好
JAVA
文件
/*
* Created on 2005-12-19 Author shaoqi
*/
package com.hode.hodeframework.modelupdate;
public class CheckFile
{
public native void displayHelloWorld();
static
{
System.loadLibrary("test");
}
public static void main(String[] args) {

new CheckFile().displayHelloWorld();
}
}
然后根据写好的文件编译成
CLASS
文件
然 后 在
classes
或
bin
之 类 的
class
根 目 录 下 执 行
javah -jni
com.hode.hodeframework.modelupdate.CheckFile
,
就会在根目录下得到一个
com_hode_hodeframework_modelupdate_CheckFile.h
的文件
然后根据头文件的内容编写
com_hode_hodeframework_modelupdate_CheckFile.c
文件
#include "CheckFile.h"
#include
#include
JNIEXPORT void JNICALL
Java_com_hode_hodeframework_modelupdate_CheckFile_displayHelloWorld(JNIEnv *env,
jobject obj)
{
printf("Hello world!\n");
return;
}
之后编译生成
DLL
文件如
“test.dll”
,名称与
System.loadLibrary("test")
中的名称一致
vc
的 编 译 方 法 :
cl -I%java_home%\include -I%java_home%\include\win32 -LD
com_hode_hodeframework_modelupdate_CheckFile.c -Fetest.dll
剩余75页未读,继续阅读











hezhangyear
- 粉丝: 3
- 资源: 3
上传资源 快速赚钱
我的内容管理 收起
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助

会员权益专享
最新资源
- ARM Cortex-A(armV7)编程手册V4.0.pdf
- ABB机器人保养总结解析.ppt
- 【超详细图解】菜鸡如何理解双向链表的python代码实现
- 常用网络命令的使用 ipconfig ping ARP FTP Netstat Route Tftp Tracert Telnet nslookup
- 基于单片机控制的DC-DC变换电路
- RS-232接口电路的ESD保护.pdf
- linux下用time(NULL)函数和localtime()获取当前时间的方法
- Openstack用户使用手册.docx
- KUKA KR 30 hA,KR 60 hA机器人产品手册.pdf
- Java programming with JNI
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈



安全验证
文档复制为VIP权益,开通VIP直接复制

评论0