• binder对于boolean类型的传递


    通过写了一个AIDL文件,查看自动生成的java文件代码得出的结论:

    假如有:  boolean loadNativeSharedLib(String libPathName);

    则对应的binder通信的实际操作为:

    写入:

    @Override public boolean loadNativeSharedLib(java.lang.String libPathName) throws android.os.RemoteException
    {
    android.os.Parcel _data = android.os.Parcel.obtain();
    android.os.Parcel _reply = android.os.Parcel.obtain();
    boolean _result;
    try {
    _data.writeInterfaceToken(DESCRIPTOR);
    _data.writeString(libPathName);
    mRemote.transact(Stub.TRANSACTION_loadNativeSharedLib, _data, _reply, 0);
    _reply.readException();
    _result = (0!=_reply.readInt());
    }
    finally {
    _reply.recycle();
    _data.recycle();
    }
    return _result;
    }

    处理&返回:

    case TRANSACTION_loadNativeSharedLib:
    {
    data.enforceInterface(DESCRIPTOR);
    java.lang.String _arg0;
    _arg0 = data.readString();
    boolean _result = this.loadNativeSharedLib(_arg0);
    reply.writeNoException();
    reply.writeInt(((_result)?(1):(0)));
    return true;
    }

    需要重点关注:


    将boolean转化为int: reply.writeInt(((_result)?(1):(0)));
    将int 还原boolean: _result = (0!=_reply.readInt());

    这是一种简洁有效地方式.

    之所以分析这个,是因为: 1)在native code调用java的service时需要考虑传递序列. 2)不借助aidl工具生成时,也需要手动实现上述两个block的代码
  • 相关阅读:
    GNOME on Arch Linux
    忽然想通不喜欢搞前端的原因
    可以一时气馁,不能放弃
    Hack语言类型化简介
    标榜
    Hack其实是一门好语言
    Focus
    PHP旧系统基于命名空间重构经验
    少即是多的设计
    IDDD 实现领域驱动设计-一个简单的 CQRS 示例
  • 原文地址:https://www.cnblogs.com/rainduck/p/3938566.html
Copyright © 2020-2023  润新知