Сценарий:
- Запуск службы
- Производитель запускается
- Производитель вызывает соединение
- Производитель подписывается на IMyClientListener
- Производитель ожидает обратного вызова
- Потребитель запускается
- Потребительский вызов подключается
- В службе Connect, служба вызывает обратный вызов для IMyClientListener и зависает навсегда.
interface IMyServiceListener {
boolean onData(in byte[] data);
}
interface IMyClientListener {
boolean onNewClient();
}
interface IMyService {
boolean connect();
boolean subscribeToClientListener(IMyClientListener listener);
boolean subscribeToListener(IMyServiceListener listener);
}
//////////Service code using platform c++ binder
class CMyService : public BnMyService
{
sp mClientListener = nullptr;
sp mListener = nullptr;
public:
static void instantiate() {
defaultServiceManager()->addService(
String16("com.my.service"), new CMyService());
}
binder::Status connect(bool* _aidl_return)
{
//blah blah other code to connect
if (mClientListener != nullptr)
{
mClientListener->onNewClient();
// Above code hangs
}
}
binder::Status subscribeToClientListener(const sp& listener, bool* _aidl_return)
{
mClientListener = listener;
*_aidl_return = true;
}
binder::Status subscribeToListener(const sp& listener, bool* _aidl_return)
{
mListener = listener;
*_aidl_return = true;
}
}
/////////Producer code using NDK binder
struct CClientListenerData
{
void* mUserData = nullptr;
};
class CMyClientListener : public aidl::com::my::BpMyClientListener
{
private:
CClientListenerData* mListener = nullptr;
public:
explicit CMyClientListener(const ::ndk::SpAIBinder& binder, CClientListenerData* listener) : BpMyClientListener(binder) {mListener = listener;}
virtual ~CMyClientListener() = default;
virtual ::ndk::ScopedAStatus onNewClient(bool* _aidl_return) override;
};
::ndk::ScopedAStatus CMyClientListener::onNewClient(bool* _aidl_return)
{
// Got the callback
return ndk::ScopedAStatus::ok();
}
class CMyProducer
{
private:
std::shared_ptr mMyServiceInterface;
std::shared_ptr mMyClientListener;
::ndk::SpAIBinder mNewBinder = ::ndk::SpAIBinder(CreateBinder::NewBinder());
CClientListenerData mListener;
CMyClientListener mCMyClientListener = CMyClientListener(mNewBinder, &mListener);
public:
CMyProducer()
{
mMyClientListener = std::shared_ptr(&mCMyClientListener);
}
bool Connect() {
::ndk::SpAIBinder binder(AServiceManager_getService("com.my.service"));
mMyServiceInterface = aidl::com::my::IMyService::fromBinder(binder);
bool ret = false;
mMyServiceInterface->connect(&ret);
return ret;
}
bool SubscribeToClient(bool* _aidl_return))
{
mMyServiceInterface->subscribeToClientListener(mMyClientListener, &ret);
}
};
Подробнее здесь: https://stackoverflow.com/questions/756 ... is-hanging
Мобильная версия