¿Cómo evito que algunas funciones se despojen?
Tengo una biblioteca estática que contiene algunas funciones de JNICALL, es decir, se espera que sean llamadas de la JVM y nunca sean referenciadas por la biblioteca compartida que liga la biblioteca estática.
Sin embargo, parece que el arranque de funciones está exterminando la función JNICALL (no es visible en arm-eabi-objdump -t). Estoy trabajando en torno a ello mediante la adición de una función ficticia con una condición imposible que llama a la función JNICALL, pero eso es sucio. Sé que hay una opción de enlace para evitar que ciertos módulos obtengan sus datos no utilizados eliminados, pero ¿qué es? ¿Y cómo especifico esa opción en el archivo .mk? No vi nada inmediatamente evidente en el brazo-eabi-ld.
- ¿Es seguro construir con -fsigned-char con Android NDK?
- Procesamiento nativo de mapa de bits y ALPHA_8
- Android NDK: Uso de la biblioteca libtool
- Un proyecto ndk simple usando la biblioteca de Eigen y jni
- Compilación de bibliotecas que requieren stl en android
Por cierto, la función de extracción no despoja a las funciones de JNICALL en la biblioteca compartida en sí, pero eliminará las de la biblioteca estática que la biblioteca compartida está enlazando. ¿Cuál es la razón de eso?
- Compilación de la última versión de OpenSSL para Android
- Indic-text-renderer usando harfbuzz y freetype
- ¿Cuáles son las funciones POSIX más importantes que no están disponibles en Android?
- Integrar MuPDF Reader en una aplicación
- JNI Warnig tipo de retorno esperado 'L' calling LocationManager.requestLocationUpdates
- Android.mk: crea todo el archivo fuente en un directorio
- Obtener el nombre del paquete y las firmas de uid / pid de la aplicación en el cliente nativo
- Fopen / fread APK Activos de NativeActivity en Android
En realidad parece que el equipo de NDK comenzó a apoyar eso (o se detuvo?), Y hay rastros de él en el sistema de construcción, pero faltan algunas partes vitales. La buena noticia es que se puede implementar fácilmente.
Vaya al directorio "build" en la instalación de NDK y busque todas las instancias de LOCAL_STATIC_LIBRARIES. Copiar y pegar todos ellos y agregar una versión de esa versión que hace lo mismo con LOCAL_STATIC_WHOLE_LIBRARIES.
Para ser exactos: En build / core / build-binary.mk, necesitará:
LOCAL_STATIC_LIBRARIES := $(call strip-lib-prefix,$(LOCAL_STATIC_LIBRARIES)) LOCAL_STATIC_WHOLE_LIBRARIES := $(call strip-lib-prefix,$(LOCAL_STATIC_WHOLE_LIBRARIES))
[…]
static_libraries := $(call map,static-library-path,$(LOCAL_STATIC_LIBRARIES)) static_whole_libraries := $(call map,static-library-path,$(LOCAL_STATIC_WHOLE_LIBRARIES))
[…]
$(call module-add-static-depends,$(LOCAL_MODULE),$(LOCAL_STATIC_LIBRARIES)) $(call module-add-static-depends,$(LOCAL_MODULE),$(LOCAL_STATIC_WHOLE_LIBRARIES))
[…]
$(LOCAL_BUILT_MODULE): $(static_libraries) $(static_whole_libraries) $(shared_libraries)
[…]
$(LOCAL_BUILT_MODULE): PRIVATE_STATIC_LIBRARIES := $(static_libraries) $(LOCAL_BUILT_MODULE): PRIVATE_WHOLE_STATIC_LIBRARIES := $(static_whole_libraries)
Tenga en cuenta la discrepancia entre STATIC_WHOLE y WHOLE_STATIC – que es cómo es en el NDK, he decidido mantenerlo de esa manera, aunque es inconsistente.
Ahora, finalmente, en build / toolchains / arm-eabi-4.4.0 / setup.mk: Ya hay el bloque PRIVATE_WHOLE_STATIC_LIBRARIES para las bibliotecas compartidas. Usted puede elegir añadir que para los ejecutables, así, aunque es más probable que no es necesario.
Vea la otra pregunta .