Cómo construir una biblioteca compartida sin JNI en Android?

Desarrollar una aplicación de Android, que necesita ser una biblioteca compartida. Ya he hecho la misma lib en Linux (usando gcc), así que quiero compilar la misma biblioteca compartida en Android (procesador ARM). Pero NDK sólo suporta JNI. Ahora quiero construir una biblioteca compartida separada sin interacción directa de JNI. Tengo un montón de archivos C y encabezados, por lo que no puedo escribir JNI para todo. Quiero construir mi biblioteca para procesadores ARM. ¿Cómo puedo hacer esto?

my stuture is ----->JNI ---->myfile.c(jni c code) ----->android.mk(here i call my two shared lib) folder1 --->include ----src ---->lib(here i will get my shared lib) folder 2 ----->include ----->src ----->lib(here i will get my 2nd shared lib) 

Aquí quiero construir mi biblioteca compartida por separado y luego lo llamaré. ¿Es posible construir un shred lib sin JNI en Android?

Android NDK no establece requisitos para el cumplimiento de JNI de los binarios construidos con él. Pero por lo general las aplicaciones de Android se escriben en Java, y cuando usan componentes nativos, el camino natural es usar JNI.

Android NDK proporciona un comando ndk-build rico y fácil de usar, que requiere que prepares al menos un archivo de Android.mk que sea usado por su sistema make. En muchos casos vale la pena el esfuerzo de preparar dicho archivo basado en su makefile (s). Pero si el proyecto que porta desde otra plataforma utiliza funciones avanzadas de configure o Cmake , puede omitir completamente el Android.mk y utilizar la cadena de herramientas independiente que forma parte del NDK, tal como se describe en la documentación oficial de NDK. Tenga en cuenta que Android no admite toda la glibc de Linux, sino un subconjunto llamado biónico . El apoyo STL tampoco es obvio, tienes que elegir una de las 7 opciones !

Puede detenerse aquí, obtener la biblioteca compartida o un archivo ejecutable y usarlos de manera tradicional en Linux. Usted puede construir su aplicación de Android en C ++ .

Pero el enfoque más fácil es construir una aplicación Java Android utilizando Android SDK, y llamar a algunos métodos nativos a través de JDK. Necesitará un contenedor .so para eso, una biblioteca que exporta funciones JNI a Java y llama a las bibliotecas que no son JNI a su vez. En Android.mk puede consultar estas bibliotecas con LOCAL_SHARED_LIBRARIES . Puede encontrar la siguiente pregunta útil para esta parte: ndk build library fuera del árbol de origen del proyecto principal .

Tendrá que cargar las bibliotecas nativas "manualmente" en su código Java. El cargador del sistema solo busca referencias no resueltas en la carpeta /system/lib .

El lugar convencional es el constructor estático de la clase Java que utiliza los métodos nativos. El orden de carga es importante. Si libone.so depende de libtwo.so , y libjni.so depende de libone y libtwo , tendrás algo así como

 { System.Load("two"); System.Load("one"); System.Load("jni"); } 

También debe asegurarse de que el constructor SDK de Android encuentre los archivos en el libs/armeabi o libs-armeabi-v7a cuando cree el archivo APK .

Es posible construir una biblioteca nativa sin escribir ningún C-código específico de JNI . Android.mk crear archivos de Android.mk y Application.mk para su biblioteca. Usted tiene un makefile válido listo, así que usted puede utilizarlo para hacer un Android.mk .

Application.mk puede ser como sigue:

 APP_OPTIM := release APP_PLATFORM := android-7 APP_STL := gnustl_static APP_CPPFLAGS += -frtti APP_CPPFLAGS += -fexceptions APP_CPPFLAGS += -DANDROID APP_ABI := armeabi-v7a APP_MODULES := <put-the-name-of-your-library-here> 

Utilice ndk-build para compilar la biblioteca.

  • Cómo obtener el tiempo de computación en NDK
  • Pasar una matriz de Mats a código nativo
  • Android NDK y C + + STL
  • Android: Xamarin JNI Binding - Herencia de clase abstracta
  • Obtener un puntero JNIEnv válido
  • Pasar una cadena al código C en Android NDK
  • Cómo devolver una matriz de JNI a Java?
  • Cómo llamar a función Java desde c
  • Cómo convertir char a jstring en JNI?
  • ¿Está proporcionando una implementación para todos los métodos nativos requeridos?
  • Android NDK / JNI: Creación de una biblioteca compartida que depende de otras bibliotecas compartidas
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.