2010-08-29 14 views
5

Tengo una biblioteca estática que contiene algunas funciones JNICALL, es decir, se espera que se llamen desde la JVM y la biblioteca compartida que vincula la biblioteca estática no hace referencia a ellas.¿Cómo evito que se eliminen ciertas funciones?

Sin embargo, parece que la eliminación de funciones está exterminando la función JNICALL (no está visible en arm-eabi-objdump -t). Estoy trabajando en ello al agregar 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, pero ¿qué es eso? ¿Y cómo especifico esa opción en el archivo .mk? No vi nada inmediatamente obvio en el brazo-eabi-ld.

Dicho sea de paso, la función stripping no elimina las funciones de JNICALL en la biblioteca compartida en sí, pero eliminará aquellas de la biblioteca estática que la biblioteca compartida está enlazando. ¿Cuál es la razón para eso?

+1

Esto acaba de aparecer - http://stackoverflow.com/questions/3549432/preventing-functions-from-being-stripped-from-a-static-library-when-linked-into-a/3559733#3559733 – fadden

+0

Y es fadden, por supuesto, mi chico de respuesta personal :) ¿Quieres publicar esto como una pregunta para que yo pueda aceptarlo? (Bueno, eso, o podría cerrar mi propia pregunta como una víctima) – EboMike

Respuesta

5

Parece que el equipo de NDK comenzó a admitir eso (¿o se detuvo?), Y hay rastros de él en el sistema de compilación, pero faltan algunas partes vitales. La buena noticia es que puede implementarse fácilmente.

Vaya al directorio "compilación" en la instalación NDK y busque todas las instancias de LOCAL_STATIC_LIBRARIES. Copie y pegue todos y añada una versión que haga lo mismo con LOCAL_STATIC_WHOLE_LIBRARIES.

Para ser más precisos: En construcción/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) 

Nota la discrepancia entre STATIC_WHOLE y WHOLE_STATIC - eso es lo que está en el NDK, he optado por que siga siendo así a pesar de que es inconsistente.

Ahora, finalmente, en build/toolchains/arm-eabi-4.4.0/setup.mk: Ya existe el bloque PRIVATE_WHOLE_STATIC_LIBRARIES para bibliotecas compartidas. Puede optar por agregar eso también para los ejecutables, aunque probablemente no sea necesario.

1
+0

¡Gracias! No lo vi cuando estaba buscando una respuesta. Sin embargo, repetiré mi pregunta en el otro hilo: ¿puedes publicar un ejemplo rápido de cómo deberías configurar el archivo Android.mk (al menos las dos líneas pertinentes para vincular)? – EboMike

+0

Agregué una nota a la otra pregunta. No sé exactamente qué hacer en el sistema de compilación NDK, pero si funciona de manera similar a los makefiles generales de Android, puede agregar los indicadores a LOCAL_LDFLAGS. – fadden

Cuestiones relacionadas