¿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.

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?

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 .

  • Trazado gráfico dinámico con openGL en Android
  • JNI ERROR DETECTADO EN APLICACIÓN: entrada no es válida UTF-8 modificado: byte de inicio ilegal 0xfc.
  • Retraso / retraso enorme de UDP con Android
  • Android NDK obtiene un error de ArrayList
  • ¿Por qué Android Studio está ignorando mi archivo .bashrc en OSX?
  • Excluyendo los dispositivos ARMv5 y ARMv6 de Google Play
  • ¿Cómo obtener un punto de ruptura en código NDK nativo y depurar código nativo en Android Studio?
  • Cómo detectar la compilación de android ndk en un archivo C / C ++?
  • Obtener el nombre de un APK de Android con C ++ y la clase NativeActivity
  • ¿Cómo cruzar la compilación de OpenSSH para ARM?
  • Desarrollo de Android NDK
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.