Можно ли связываться со службой Java от клиента Native C++ и получать данные от службы?
В настоящее время я изучаю, как работают связующие в целом. Рассматривая следующие проекты:
https://github.com/qianjigui/android_system_service_example https://github.com/cloudchou/NativeBinderJavaClientDemo
Я понимаю, что транзакция связывания возможна в
- Собственный сервис <-> Java-клиент
- Собственный сервис <-> Собственный клиент
- Служба Java <-> Клиент Java
Последний вопрос, который продолжает меня беспокоить: возможно ли следующее...?
- Служба Java <-> Собственный клиент
Я не могу найти ни статей, ни кода, которые бы на самом деле это реализовывали, ни людей, обсуждающих возможность этого. Из того, что я понимаю, транзакция основана исключительно на описании.aidl, поэтому язык реализации не имеет значения, поэтому вышеупомянутое должно быть возможным. Но я просто хочу быть уверен...
3 ответа
Я думаю, что он вряд ли может использовать собственный клиент связывания, поскольку API связывания не является частью NDK. Вот справочная ссылка: Как создать собственный сервис для Android и использовать связыватель для связи с ним?
Однако, если вы сможете получить все исходные коды ASOP и использовать инструменты, созданные для Android, это станет возможным.
Благодаря NDK binder API это стало возможным (доступно с Android 10), но сервис по-прежнему не может быть запущен / привязан из собственного кода (без использования частных API).
https://developer.android.com/ndk/reference/group/ndk-binder
Это вполне возможно: Binder пересекает границы процесса, поэтому язык программирования, используемый для реализации службы, или ее вызывающий объект не имеет значения. Вы можете легко увидеть собственный клиент -> службу Java, используя «сервисный вызов» (для удовольствия, попробуйте «сервисный телефон 2 s16 555-1234», чтобы открыть окно набора номера, или «панель состояния сервисного звонка 1», «сервисный звонок statusbar 2 "и т. д. Транзакция не требует AIDL - AIDL просто создает шаблонный код для ее облегчения.
Обратите внимание, однако, что если вы хотите иметь дело с объектами Java, вам нужно будет выполнить «парцеллинг» (сериализацию) самостоятельно. То есть выясните, каков порядок интерфейса Parcelable (в readFromParcel), а затем разместите примитивные типы (uint32_t, float, String и т. Д.) Один за другим.