Как создать андроид нативный сервис и использовать связующее для связи с ним?

Моя основная задача — создать нативный сервис в Android, а затем написать простую нативную программу для его тестирования. Допустим, я хочу написать простой сервис, который возвращает мне сумму 2 целых. Я должен использовать связующие, чтобы поговорить с ним из программы, я пытался гуглить, но не могу найти точный пример. Мне нужно знать, как создать собственный сервис и найти его в программе, а также, если необходимо, в Java.

9

Решение

Если вы создаете обычное приложение Android с использованием NDK, вы не можете использовать Binder, потому что он не является частью API NDK.

Посмотрите в NDK docs / STABLE-APIS.html полный список стабильных API, а в этой теме — явный комментарий Дэвида Тернера (сопровождающего NDK) о том, что Binder не поддерживается API.

https://groups.google.com/forum/?fromgroups=#!topic/android-ndk/1QmVRrNckfM

Ваши варианты:

  • Используйте некоторую другую форму IPC в собственном коде — например, сокет домена UNIX
  • Сделайте это на Java, используя обычные Service и средства AIDL Android SDK. Если вы хотите объединить это с нативным кодом, вы можете вызывать Java из нативного кода, используя JNI.
  • (Не рекомендуется) Скопируйте соответствующие библиотеки и заголовки из проекта Android с открытым исходным кодом; встроить в свой проект NDK; и использовать API. Однако это официально не поддерживается и, скорее всего, приведет к поломке вашего приложения в будущих выпусках, поскольку Google не обязан поддерживать совместимость в таких библиотеках (и часто этого не делает). Это также очень сложно, так как вам нужно найти способ регистрации службы, чтобы клиент мог ее найти.
10

Другие решения

Решение, которое я нашел, состоит в том, чтобы использовать связующие в нативном и использовать

defaultServiceManager()->addService(
String16("TestService"),new CalcService());

а затем использовать связующие и использовать следующие на стороне клиента.

sp<IServiceManager> sm = defaultServiceManager();
sp<IBinder> binder = sm->getService(String16("TestService"));

Я нашел здесь примеры того, как это сделать:
https://github.com/gburca/BinderDemo/blob/master/binder.cpp

9

После изучения и написания кода @ Android NDK я обнаружил, что API связующего НЕ доступно в Android NDK.
И даже если вы используете Android с открытым исходным кодом для вызова API Binder, возможно, вы получите доступ запрещен из-за проверки безопасности связующего.

Здесь, если я хочу добавить сервис в Системный сервис, мне нужна группа пользователей системного уровня. Подробные коды вы можете найти https://github.com/qianjigui/android_system_service_example. Он содержит клиент и сервис уровня C и Java, но вам нужно разрешение системы.

3