IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Native Binder -> 正文阅读

[移动开发]Native Binder

?

system/core/include/utils/RefBase.h
// This provides primarily wp<> weak pointer types and RefBase, which work
// together with sp<> from <StrongPointer.h>.

// sp<> (and wp<>) are a type of smart pointer that use a well defined protocol
// to operate. As long as the object they are templated with implements that
// protocol, these smart pointers work. In several places the platform
// instantiates sp<> with non-RefBase objects; the two are not tied to each
// other.

// RefBase is such an implementation and it supports strong pointers, weak
// pointers and some magic features for the binder.

// So, when using RefBase objects, you have the ability to use strong and weak
// pointers through sp<> and wp<>.

// Normally, when the last strong pointer goes away, the object is destroyed,
// i.e. it's destructor is called. HOWEVER, parts of its associated memory is not
// freed until the last weak pointer is released.

// Weak pointers are essentially "safe" pointers. They are always safe to
// access through promote(). They may return nullptr if the object was
// destroyed because it ran out of strong pointers. This makes them good candidates
// for keys in a cache for instance.

// How is this supposed / intended to be used?
// Our recommendation is to use strong references (sp<>) when there is an
// ownership relation. e.g. when an object "owns" another one, use a strong
// ref. And of course use strong refs as arguments of functions (it's extremely
// rare that a function will take a wp<>).

// Typically a newly allocated object will immediately be used to initialize
// a strong pointer, which may then be used to construct or assign to other
// strong and weak pointers.

// Use weak references when there are no ownership relation. e.g. the keys in a
// cache (you cannot use plain pointers because there is no safe way to acquire
// a strong reference from a vanilla pointer).

// This implies that two objects should never (or very rarely) have sp<> on
// each other, because they can't both own each other.

// Do not construct a strong pointer to "this" in an object's constructor.
// The onFirstRef() callback would be made on an incompletely constructed
// object.

frameworks/native/libs/binder/include/binder/IBinder.h
/**
?* Base class and low-level protocol for a remotable object.
?* You can derive from this class to create an object for which other
?* processes can hold references to it. ?Communication between processes
?* (method calls, property get and set) is down through a low-level
?* protocol implemented on top of the transact() API.
?*/

frameworks/native/libs/binder/include/binder/IInterface.h

#define DECLARE_META_INTERFACE(INTERFACE) ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? \
public: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? \
? ? static const ::android::String16 descriptor; ? ? ? ? ? ? ? ? ? ? ? ?\
? ? static ::android::sp<I##INTERFACE> asInterface( ? ? ? ? ? ? ? ? ? ? \
? ? ? ? ? ? const ::android::sp<::android::IBinder>& obj); ? ? ? ? ? ? ?\
? ? virtual const ::android::String16& getInterfaceDescriptor() const; ?\
? ? I##INTERFACE(); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? \
? ? virtual ~I##INTERFACE(); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?\
? ? static bool setDefaultImpl(std::unique_ptr<I##INTERFACE> impl); ? ? \
? ? static const std::unique_ptr<I##INTERFACE>& getDefaultImpl(); ? ? ? \
private: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?\
? ? static std::unique_ptr<I##INTERFACE> default_impl; ? ? ? ? ? ? ? ? ?\
public: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? \


#define IMPLEMENT_META_INTERFACE(INTERFACE, NAME) ? ? ? ? ? ? ? ? ? ? ? \
? ? DO_NOT_DIRECTLY_USE_ME_IMPLEMENT_META_INTERFACE(INTERFACE, NAME) ? ?\


#define DO_NOT_DIRECTLY_USE_ME_IMPLEMENT_META_INTERFACE(INTERFACE, NAME)\
? ? const ::android::StaticString16 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? \
? ? ? ? I##INTERFACE##_descriptor_static_str16(__IINTF_CONCAT(u, NAME));\
? ? const ::android::String16 I##INTERFACE::descriptor( ? ? ? ? ? ? ? ? \
? ? ? ? I##INTERFACE##_descriptor_static_str16); ? ? ? ? ? ? ? ? ? ? ? ?\
? ? const ::android::String16& ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?\
? ? ? ? ? ? I##INTERFACE::getInterfaceDescriptor() const { ? ? ? ? ? ? ?\
? ? ? ? return I##INTERFACE::descriptor; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?\
? ? } ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? \
? ? ::android::sp<I##INTERFACE> I##INTERFACE::asInterface( ? ? ? ? ? ? ?\
? ? ? ? ? ? const ::android::sp<::android::IBinder>& obj) ? ? ? ? ? ? ? \
? ? { ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? \
? ? ? ? ::android::sp<I##INTERFACE> intr; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? \
? ? ? ? if (obj != nullptr) { ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? \
? ? ? ? ? ? intr = static_cast<I##INTERFACE*>( ? ? ? ? ? ? ? ? ? ? ? ? ?\
? ? ? ? ? ? ? ? obj->queryLocalInterface( ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? \
? ? ? ? ? ? ? ? ? ? ? ? I##INTERFACE::descriptor).get()); ? ? ? ? ? ? ? \
? ? ? ? ? ? if (intr == nullptr) { ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?\
? ? ? ? ? ? ? ? intr = new Bp##INTERFACE(obj); ? ? ? ? ? ? ? ? ? ? ? ? ?\
? ? ? ? ? ? } ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? \
? ? ? ? } ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? \
? ? ? ? return intr; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?\
? ? } ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? \
? ? std::unique_ptr<I##INTERFACE> I##INTERFACE::default_impl; ? ? ? ? ? \
? ? bool I##INTERFACE::setDefaultImpl(std::unique_ptr<I##INTERFACE> impl)\
? ? { ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? \
? ? ? ? /* Only one user of this interface can use this function ? ? */ \
? ? ? ? /* at a time. This is a heuristic to detect if two different */ \
? ? ? ? /* users in the same process use this function. ? ? ? ? ? ? ?*/ \
? ? ? ? assert(!I##INTERFACE::default_impl); ? ? ? ? ? ? ? ? ? ? ? ? ? ?\
? ? ? ? if (impl) { ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? \
? ? ? ? ? ? I##INTERFACE::default_impl = std::move(impl); ? ? ? ? ? ? ? \
? ? ? ? ? ? return true; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?\
? ? ? ? } ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? \
? ? ? ? return false; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? \
? ? } ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? \
? ? const std::unique_ptr<I##INTERFACE>& I##INTERFACE::getDefaultImpl() \
? ? { ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? \
? ? ? ? return I##INTERFACE::default_impl; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?\
? ? } ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? \
? ? I##INTERFACE::I##INTERFACE() { } ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?\
? ? I##INTERFACE::~I##INTERFACE() { } ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? \

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-07-27 16:20:36  更:2021-07-27 16:21:21 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/4 13:50:03-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码