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

2 Solutions collect form web for “¿Cómo evito que algunas funciones se despojen?”

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 .

  • Gifflen Señal Fatal 11
  • OpenCV Android - No se puede resolver la función JNI correspondiente
  • NDK - Cómo utilizar una biblioteca .so generada en otro proyecto
  • Ldd equivalente en android
  • Entrada de teclado en android NDK usando NativeActivity
  • Cargando bibliotecas compartidas de terceros desde una actividad nativa de Android
  • JAVAH no puede encontrar clase (android ndk)
  • Cocos2d-x-2.1.4: error: formato no es una cadena literal y no hay argumentos de formato
  • Cómo desarrollar / portar una biblioteca C nativa a android?
  • Android L | Libusb_init devuelve LIBUSB_ERROR_OTHER (-99)
  • Android NDK - OpenGL ES 2.0 - vinculación de la biblioteca
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.