21xrx.com
2024-09-20 05:15:29 Friday
登录
文章检索 我的文章 写文章
如何在C++中使用android::sp?
2023-07-02 09:41:28 深夜i     --     --
C++ android::sp 使用

Android NDK是为了在Android操作系统上为C++开发者提供一种开发环境与工具集。使用Android NDK,开发者可以使用C++; 并且使用的访问接口可以是Android提供的大部分API。

一个例子是,如果你想使用Android上的SurfaceView,你需要使用Java语言并继承View类。但是,如果你的目标是使用C++编写代码,那么你就可以使用Android的binder支持库。此支持库就是用于生成客户端接口代码的软件。其中的binder代表将两个C++代码部分连接在一起。使用Android NDK与binder使得在C++中进行GUI编程变得更容易。

关于在C++中使用android::sp,以下是一个示例代码:


#include <android/binder_interface_utils.h>

#include <android/binder_auto_utils.h>

#include <new>

using namespace android;

class IMyBinder : public IBinder {

public:

  static constexpr char const* getServiceName()

    return "com.example.binder_sample.IMyBinder";

  

  DECLARE_META_INTERFACE(MyBinder)

  virtual void register_callback(const sp<IBinder>& callback) = 0;

};

namespace android {

struct ParcelableData : public Parcelable {

  enum Status

    STATUS_UNKNOWN = -1;

  ParcelableData() : status(STATUS_UNKNOWN), data(0) {}

  ParcelableData(Status status, int32_t data) : status(status), data(data) {}

  virtual ~ParcelableData() {}

  // Implementation of Parcelable interface.

  virtual status_t writeToParcel(Parcel* parcel) const {

    status_t result = parcel->writeInt32(status);

    result |= parcel->writeInt32(data);

    return result;

  }

  virtual status_t readFromParcel(const Parcel* parcel) {

    status_t result = parcel->readInt32(&status);

    result |= parcel->readInt32(&data);

    return result;

  }

  static sp<Parcelable> createFromParcel(const Parcel& parcel_addr) {

    sp<ParcelableData> msg = new (std::nothrow) ParcelableData();

    if (msg.get() != nullptr) {

      const Parcel* parcel = &parcel_addr;

      if (parcel->dataSize()) {

        if (msg->readFromParcel(parcel))

          msg = nullptr;

        

      } else {

        ALOGE("createFromParcel() No parcel data.");

        msg = nullptr;

      }

    }

    return msg;

  }

  static inline sp<ParcelableData> fromBinder(const sp<IBinder>& binder) {

    if (!binder.get())

      return nullptr;

    

    return fromReflectedInterface(binder->queryLocalInterface(

      String16(IMyBinder::getServiceName())));

  }

  Status status;

  int32_t data;

private:

  DISALLOW_COPY_AND_ASSIGN(ParcelableData);

};

class BpMyBinder : public BpInterface<IMyBinder> {

public:

  explicit BpMyBinder(const sp<IBinder>& impl)

    : BpInterface<IMyBinder>(impl) {}

  virtual void register_callback(const sp<IBinder>& callback) override

  

  IMPLEMENT_META_INTERFACE(MyBinder, "com.android.ccb.BpMyBinder")

};

IMPLEMENT_META_INTERFACE(MyBinder, "com.example.binder_sample.IMyBinder")

};

这只是一个简单的示例代码,但是这应该足以让任何C++开发人员开始使用android::sp。如果你正在开发基于Android NDK的项目,强烈建议你开始从这个示例代码入手。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复