Android NDK: cómo vincular varias bibliotecas de terceros
Digamos que estamos construyendo una biblioteca compartida A que necesita enlazar a 2 librerías estáticas externas B y C. Todo lo que tienes es libB.a y libC.a, junto con sus archivos de cabecera.
Aquí está un Android.mk simplificado para libA:
- Android Studio - Biblioteca de módulos App + NDK
- Android NDK, dos bibliotecas estáticas y vinculación
- Android NDK: Intentando conectar JnetPcap
- Utilizando bibliotecas estáticas pre-construidas para el desarrollo de Android NDK
- Depuración de la biblioteca estática NDK de Android (¿combinar proyectos?)
LOCAL_LDLIBS := ../external/libB.a ../external/libC.a include $(BUILD_SHARED_LIBRARY)
AFAIK, la forma en que se enlazan las obras de las bibliotecas compartidas es:
- Agarrar todos los archivos objeto de B y C
- Eliminar los archivos objeto que A no hace referencia
- Resolver referencias en B y C
Esto da errores de enlace porque B y C se llaman entre sí, específicamente llaman a funciones que han sido eliminadas en el paso 2 porque A no las llamó.
Si construimos las librerías estáticas nosotros mismos, entonces es simplemente una cuestión de reemplazar LOCAL_STATIC_LIBRARIES con LOCAL_WHOLE_STATIC_LIBRARIES, lo que impide la eliminación de código (a expensas del tamaño del código). Bajo el capó, pasa –whole-archive al enlazador.
Como no construimos B y C (y ni siquiera tenemos la fuente para reconstruirlas), ¿cuáles son las opciones?
- Hacer referencia manualmente a las funciones que faltan de A, para que no se despojen
- Averiguar cómo pasar –whole-archive al enlazador para las bibliotecas externas estáticas
- Utilice el PREBUILT_STATIC_LIBRARY (visto lo mencionado, pero nunca lo utilizó, y el de acuerdo con los documentos que no suena aplicable en este caso)
- Construya un ejecutable en lugar de una biblioteca compartida (que no quitará el código de la misma manera)
- Mover / cambiar el nombre de las librerías externas para engañar al sistema de creación de NDK para que piensen que son mías, para poder agregarlas a LOCAL_WHOLE_STATIC_LIBRARIES.
He ido con la opción 1 porque es la primera cosa que trabajó, pero obviamente no es grande. Estoy preguntando si hay una solución mejor.
La respuesta a esta pregunta ( problema de enlace cuando las bibliotecas estáticas y compartidas preconfiguradas con el NDK de Android ) me hizo preguntarme si necesito reevaluar mi configuración de compilación (biblioteca compartida que enlaza con una biblioteca estática externa). No puedo comentar allí, así que hice mi propia pregunta aquí.
- Vinculación de FFTW a una aplicación Android de NDK
- Biblioteca de memoria de montón sin restricciones para mapas de bits mediante NDK en Android
- Adición de dependencias de biblioteca de terceros a Android Library
- Direct Code Vs Library en android
- Creación de un paquete de biblioteca de Android que incluye un paquete externo (nativo o Java)
- Android Gradle Adición de biblioteca estática
- Cómo compilar una biblioteca estática utilizando el Android NDK?
- Android NDK: Enlace mediante una biblioteca estática precompilada
La respuesta se puede encontrar en Cómo lidiar con las dependencias recursivas entre bibliotecas estáticas que utilizan el enlazador binutils? .
LOCAL_LDLIBS := -L ../external/ -lB -lC -lB
Tomé la muestra NDK de dos libras, e hizo un cambio mínimo para demostrar la técnica:
https://github.com/alexcohn/TwoLibs—circular-dependency/commits/master
- Recibiendo la respuesta del eco del HTTP POST de un archivo de PHP (enviar los POSTS funciona muy bien, es el recibir que no puedo imaginar)
- Cómo personalizar el intervalo de tiempo de largo / retardo botón presionado en android