2011-07-12 17 views
15

Tengo una pregunta sobre las limitaciones de lo que puede hacer en el código nativo en la plataforma Android.Android NDK limitaciones?

Básicamente, he desarrollado una biblioteca en código C nativo que usa sockets UDP para SIP/RTP y utiliza OpenAL para grabación/reproducción de audio, básicamente, toda la aplicación. La idea es tener tanto como sea posible en código C nativo en lugar de código Java. Quiero hacer esto porque también voy a usarlo en otras plataformas.

Mi pregunta es sencilla: ¿es posible simplemente usar Java para la GUI y luego todo el procesamiento en código nativo? ¿Qué sucederá cuando mi código nativo intente crear un socket, vincularlo, grabar audio, reproducirlo, etc., ya que está en código nativo, necesito configurar permisos para ello (como aplicaciones que acceden al micrófono y otras cosas) o ¿Pasará por alto esto desde su código nativo? ¿Puede el código nativo hacer casi cualquier cosa que quiera en Android como en PC?

Lo siento si no está claro; simplemente digo y voy a tratar de mejorarlo

Gracias

Respuesta

4

Usted puede hacer casi cualquier cosa que desee en código nativo, pero el único nivel de sistema operativo realmente soportado se OpenGL, OpenSL y algunas bibliotecas de procesamiento de números (compresión, matemática, etc.).

Sin embargo, en cualquier momento puede usar el JNI para llamar a un método Java, por lo que puede usar la API estándar de Android para redes (clases como Socket, etc.). Obviamente, dado que la llamada pasa por la API de Java, se aplican todos los permisos normales de Android (como android.permission.INTERNET).

EDITAR: Tal como se explica en los comentarios, las bibliotecas estándar que forman parte del NDK sí tienen soporte para sockets.

+0

¿Podría explicar lo que quiere decir con 'compatible'? Por ejemplo, no puedo encontrar conectores en la lista de bibliotecas NDK. ¿Todavía puedo usarlos? ¿Qué archivos de cabecera y cosas usas? ¿No hay sys/sockets? – KaiserJohaan

+1

No te gustará esto, pero ... tendrás que pasar por Java, es decir, usar FindClass en 'Socket', luego obtener el método para el constructor, el método para' leer', el método para 'write' , almacenas el socket como un 'jobject' en tu código, y usas' CallVoidEnvMethod' o algo similar. Suena absolutamente horrible, pero puedes escribir una capa delgada que traduce entre C y Java y terminar con solo un puñado de esas funciones de traducción. – EboMike

+0

Btw, como señaló Kazuki, PUEDE haber soporte total para la API de socket, pero personalmente siempre he usado esta indirección a través de Java. – EboMike

3

aún necesita la aplicación para tener permisos. Por ejemplo, sus sockets nativos no funcionarán sin android.permission.INTERNET en el manifiesto.

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

Otra opción es crear el socket en la capa de Java y pasarlo. Aquí está un ejemplo de la interacción con la toma de tierra nativa, consulte el método 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

The Native Android API es un buen artículo para NDK.

¿es posible usar simplemente Java para la GUI y luego todo el procesamiento en código nativo?

Sí. Y debe configurar los permisos adecuados para su AndroidManifest.

grabar audio, jugar,

Es necesario utilizar la API opensl es para la grabación y reproducción de audio en el lado nativo. Significa que su aplicación debe ser para Android 2.3 o posterior.

O, NVIDIA proporciona un marco que nos permite desarrollar usando C++ para eventos de Android, sensores, audio, etc. aunque para Android 2.2 o versiones anteriores.

Tegra Resources - Android SDK & NDK sample applications and documentation

+0

¿No es compatible OpenAL con Android? Creo que leí en algún lugar al respecto, o que puede incluir la biblioteca compartida OpenAL en la apk. – KaiserJohaan

+0

[Implementación de software OpenAL para Android] (http://bit.ly/cc3Rpq). Es una implementación de software, por lo tanto, OpenSL ES es más eficiente que esta implementación OpenAL. –

0

Es posible que como de revisar csipsimple que es un ejemplo del uso de la biblioteca pjsip SIP (que está escrito en C) en una aplicación de java androide.

No he estudiado cómo funciona la comunicación de sockets, pero debería darle un ejemplo más completo de lo que está tratando de hacer.