欺骗编译器取得ISurface对象的方法
来源:互联网 发布:windows网络文件系统 编辑:程序博客网 时间:2024/06/06 09:11
欺骗编译器取得ISurface对象的方法
我们在使用Android NDK的Surface的时候,遇到无法得到ISurface对象的问题,描述如下:
Surface类的定义如下:
class Surface
: public EGLNativeBase
{
public:
...
private:
// can't be copied
...
friend class SurfaceComposerClient;
friend class SurfaceControl;
// camera and camcorder need access to the ISurface binderinterface for preview
friend class Camera;
friend class MediaRecorder;
// mediaplayer needs access to ISurface for display
friend class MediaPlayer;
friend class IOMX;
// this is just to be able to write some unit tests
friend class Test;
sp getClient() const;
sp getISurface() const;
...
}
注意看,如果我们要得到ISurface对象,必须调用getISurface函数,可是这个函数在类定义里是private的,
外部无法访问。
另还注意到,这里定义了一堆的友元类,从语法上讲,友元类是可以访问Surface的私有成员的,因此可以想
个方法来欺骗编译器,如下:
我们定义了一个类,按照上面的提示,取名字叫Test,这是关键
// 这个类纯粹是为了取得ISurface对象,
// 因为在Surface里,要取得ISurface对象,必须是友元类,
// 因此在这里按Surface类的定义,假造了一个友元类来欺骗编译器
namespace android {
class Test {
public:
static sp & getISurface(const sp &surface)
{
return surface->mSurface;
}
};
};
这样,我们可以用下面的语句来获取ISurface对象
// 这一句需要权限,要在surface.h里加入frends class
isurface = Test::getISurface(surface);
这里还有一个提示,一个类的成员,是私有还是公有,是编译器来检查的,是在编译的时候检查的,
在编译完成后,二进制代码里,就没有这个区别了,可以随便访问。
http://blog.sina.com.cn/s/blog_53d1e55b0100ne50.html
- 欺骗编译器取得ISurface对象的方法
- 欺骗编译器取得ISurface对象的方法
- 指纹识别的欺骗方法
- Servlet中取得application对象的两种方法
- 取得Spring配置文件中的Bean对象的通用方法
- 你不知道的指针―被欺骗的编译器
- 方法欺骗
- 取得鼠标所在位置的对象
- 取得鼠标所在位置的对象
- 取得鼠标所在位置的对象
- 防止arp欺骗攻击的方法
- linux防arp欺骗的方法
- 取得网页里对象的绝对位置的两种方法
- AIDL:远程调用服务里的方法失败,提示取得的IBinder对象NullPointerException
- 相对路径的取得方法
- 取得磁盘符号的方法
- 取得磁盘符号的方法
- 取得DataList内容的方法
- 关于Signal tap II 调试--很重要
- 检查溢出
- 显示转换(强制转换),访问子类中的值i
- Qt 线程基础(QThread、QtConcurrent等)
- 修改窗体中所有Button属性
- 欺骗编译器取得ISurface对象的方法
- 总统府
- 普通应用使用Surface的方法
- 向Surface写位图数据的方法
- 星外虚拟主机提权拿服务器
- Android ISurface PostBuffer 处理流程
- 一个很有意思培训
- 背影
- 发现一个不错的手机在线制作电子书网站,留个记号!