Ограничения Android NDK?

У меня есть вопрос об ограничениях того, что вы можете сделать в собственном коде на платформе Android.

В основном я разработал библиотеку в собственном C-коде, который использует UDP-сокеты для SIP/RTP и использует OpenAL для записи/воспроизведения звука - в основном, всего приложения. Идея состоит в том, чтобы как можно больше использовать собственный код C, а не код Java. Я хочу сделать это, потому что я собираюсь использовать его и на других платформах.

Мой вопрос тогда просто - возможно ли просто использовать Java для графического интерфейса, а затем всю обработку в собственном коде? Что произойдет, когда мой собственный код попытается создать сокет, связать его, записать аудио, воспроизвести его и т.д. - так как он находится в собственном коде, мне нужно установить для него разрешения (например, приложение, получающее доступ к микрофону и еще много чего), или он просто обходит этот материал с его собственного кода? Может ли собственный код делать что угодно на Android, как на ПК?

Извините, если его неясно; просто скажите, и я постараюсь улучшить его.

Спасибо

Ответ 1

В собственном коде вы можете делать практически все, что хотите, но единственная поддержка на уровне ОС - OpenGL, OpenSL и некоторые хрустящие библиотеки (сжатие, математика и т.д.).

Однако в любое время вы можете использовать JNI для вызова метода Java, чтобы вы могли использовать стандартный Android API для сетей (такие классы, как Socket и т.д.). Очевидно, что, поскольку вызов проходит через API Java, применяются все обычные разрешения для Android (например, android.permission.INTERNET).

EDIT: как указано в комментариях, стандартные библиотеки, входящие в состав NDK, имеют поддержку сокетов.

Ответ 2

Вам все равно нужно, чтобы ваше приложение имело разрешения. Например, ваши родные сокеты не будут работать без android.permission.INTERNET в манифесте.

<manifest xlmns:android...>
 ...
 <uses-permission android:name="android.permission.INTERNET"></uses-permission>
</manifest>

Другой вариант - создать сокет на уровне Java и передать его. Здесь приведен пример взаимодействия с сокетом на родине, см. Метод org_..._OpenSSLSocketImpl_connect():

http://www.netmite.com/android/mydroid/dalvik/libcore/x-net/src/main/native/org_apache_harmony_xnet_provider_jsse_OpenSSLSocketImpl.cpp

Ответ 3

Собственный Android API - хорошая статья для NDK.

Можно ли просто использовать Java для GUI, а затем всю обработку в собственном коде?

Да. И вам нужно установить соответствующие разрешения для вашего AndroidManifest.

записать аудио, воспроизвести его,

Вам необходимо использовать API OpenSL ES для записи и воспроизведения звука на родной стороне. Это означает, что ваше приложение должно быть для Android 2.3 или новее.

Или NVIDIA предоставляет платформу, которая позволяет нам разрабатывать с использованием С++ для Android-событий, сенсоров, аудио и т.д., хотя для Android 2.2 или ранее.

Tegra Resources - примеры приложений и документации для Android SDK и NDK

Ответ 4

Вам может понравиться csipsimple, что является примером использования pjsip sip library (которая написана на C) в приложении java android.

Я не смотрел, как это происходит сокеты, но он должен дать вам более полный пример того, что вы пытаетесь сделать.