2009-11-06 18 views
8

Estoy especialmente interesado en lo portátil que es entre varios teléfonos. Tenemos una aplicación con algunos códigos pesados ​​de cómputo que nos gustaría compartir entre Android y iPhone. Si pudiéramos escribirlo en C, tendríamos una única base de código, pero si el NDK solo admite un subconjunto de los procesadores que los fabricantes de teléfonos están creando, o si tenemos que recompilar para cada procesador, esa no es una solución viable .¿Alguna experiencia con Android NDK?

Gracias por cualquier experiencia con él.

+1

Para aclarar, no me preocupa el lado del iPhone de la ecuación. Sé que tendré que compilarlo por separado para el iPhone (usa bibliotecas estáticas, no dinámicas). Me preocupa que si creo un .so para Android, solo será compatible con ese subconjunto de teléfonos Android que son compatibles con el brazo-eabi. Tal vez estoy mostrando mi ignorancia de hardware aquí, pero si todos los teléfonos Android tienen que cumplir con ese estándar, entonces no hay problema. – john146

+0

> Tenemos una aplicación con algunos códigos pesados ​​de cómputo que nos gustaría compartir entre Android y iPhone. iPhone (a partir de iOS 4.2) no admite objetos compartidos creados por el usuario –

Respuesta

2

Sobre el tema de si todo Android (versión 1.5+) móviles apoyarán la salida de la corriente NDK:

Todo lo que puedo decir es que no hay nada en la documentación que sugiera lo contrario (a menos que tal vez, si se lee una implicación en "este comunicado soporta el conjunto de instrucciones ARMv5TE"), y sigo bastante de cerca las noticias de Android y no he oído hablar de que se hayan lanzado teléfonos Android con una arquitectura que no sea ARM (aunque some people hacked together a build for EeePC). Mirando el Android source, hay rastros de una sola plataforma, x86. En cuanto a los planes futuros de Google y el OHA? Tendría que preguntarles. Recientemente anunciaron algunos developer days, pero probablemente todos los puntos se hayan ido ahora (el primero es hoy). Me registré bastante temprano para el día de Londres (día 17), así que si entro intentaré obtener una respuesta allí (estoy ansioso por saberlo definitivamente también).

2

No estoy muy familiarizado con el desarrollo de Iphone, pero si miras en android ndk page, en la sección de herramientas de desarrollo, enumera los encabezados garantizados disponibles en la plataforma, por lo que si el iphone admite estas funciones, o puedes crear interfaces entre su código y las bibliotecas nativas en ambas plataformas que no veo por qué no funcionaría.

2

El NDK es básicamente una implementación del Java Native Interface para Android. Te da GCC 4.2.1 (el conjunto completo de herramientas por lo que puedo ver) con el objetivo arm-eabi. Si el código resultante se ejecutará en un iPhone u otros dispositivos, no sé; Nunca he codificado para el iPhone. Esto es lo que file tiene que decir acerca de algo que construí con el NDK así que quizás se puede comparar:

libpuzzles.so: ELF 32-bits LSB objeto compartido, ARM, versión 1 (SYSV), vinculado dinámicamente, no se despojado

(. strip está incluido; yo no he corrido aquí) aquí es gcc -v o g++ -v (son idénticos):

El uso de especificaciones técnicas incorporadas.

Target: brazo-EABI

Configurado con: /opt/digit/android/git/android-ndk/out/arm-eabi-4.2.1/toolchain/src/gcc-4.2.1/configure --prefix =/opt/digit/android/git/android-ndk/build/prebuilt/linux-x86/arm-eabi-4.2.1 --target = brazo-eabi --host = x86 _ 64-unknown-linux -gnu --build = x86 _ 64-unknown-linux-gnu --enable-languages ​​= c, C++ --disable-libssp --enable-threads --disable-nls --disable-libmudflap --disable-libgomp - -disable-libstdc __- v3 --disable-sjlj-exceptions --disable-shared --with-float = soft --with-fpu = vfp --with-arch = armv5te --enable-target-optspace --with- abi = aapcs --disable-nls --prefix =/opt/digit/android/git/android-ndk/build/prebuilt/linux-x86/arm-eabi-4.2.1 --with-sysroot =/opt/digit/android/git/android-ndk/bu ild/plataformas/magdalena/arch-brazo --program-transformar-name = s, ^, brazo-eabi-,

modelo de rosca: sola

versión gcc 4.2.1

Suponiendo el código se ejecutará, administrar esto en el nivel de la API es un problema separado e interesante. Android solo te permitirá llamar al código nativo a través de la API de JNI. No estoy familiarizado con el enfoque de iPhone, pero sé que no es Java, así que supongo que es más parecido a la vinculación dinámica estándar o dlopen()? Lo que quiero decir es que tendrías que hacer que tus funciones JNI (p. Ej., Java_com_example_Foo_YourMethod(JNI_Env*, jobject, ...)) reciban un llamado de algo que no es una JVM (¿el código de tu iPhone falsifica un JNI_Env por ejemplo?) O, mucho menos horriblemente, comenzar proporcionando una API nativa adecuada para iPhone y luego incluye un contenedor JNI, que las plataformas que no son JNI pueden ignorar de forma segura, lo que supongo que es un enfoque común para este tipo de cosas. Espero que ayude.

0

He tenido una experiencia agradable escribiendo aplicaciones JNI/C cruzadas con procesamiento de framebuffer en NDK y renderizado en JAVA.

Pitty, es una solución solo para Android