Comment compiler une bibliothèque statique en utilisant le NDK Android?

J'essaie de compiler une bibliothèque statique à utiliser sur Android mais je n'arrive pas à comprendre comment la compiler. La bibliothèque utilise des bibliothèques standard (stdio.h etc...) et libxml2.

J'essaie de compiler en utilisant arm-eabi-gcc mais j'obtiens l'erreur suivante:

/ cygdrive / c / Android-ndk-r4/construire/plates-formes/android-8/arch-x86/usr/inclure/asm / posix_types.h:15:28: erreur: posix_types_64.h: aucun fichier ou répertoire de ce type

Comment puis-je faire en sorte que cela fonctionne?

33
demandé sur RzR 2010-05-31 17:32:27

3 réponses

Si je comprends bien, la méthode correcte consiste à utiliser ndk-build et à ne pas invoquer directement le compilateur.

Dans Android.mk, vous devez spécifier un module pour chaque bibliothèque statique que vous souhaitez compiler, puis spécifiez que votre bibliothèque partagée doit l'utiliser.

Exemple de modification Android.mk fichier de l'exemple de projet hello-jni:

LOCAL_PATH := $(call my-dir)

# Define vars for library that will be build statically.
include $(CLEAR_VARS)
LOCAL_MODULE := <module_name>
LOCAL_C_INCLUDES := <header_files_path>
LOCAL_SRC_FILES :=  <list_of_src_files>

# Optional compiler flags.
LOCAL_LDLIBS   = -lz -lm
LOCAL_CFLAGS   = -Wall -pedantic -std=c99 -g

include $(BUILD_STATIC_LIBRARY)

# First lib, which will be built statically.
include $(CLEAR_VARS)
LOCAL_MODULE := hello-jni
LOCAL_STATIC_LIBRARIES := <module_name>
LOCAL_C_INCLUDES := <header_files_path>
LOCAL_SRC_FILES := hello-jni.c

include $(BUILD_SHARED_LIBRARY)

Si vous voulez contrôler les modules à compiler lorsque vous exécutez ndk-build, vous pouvez créer un Application.mk fichier (dans le même répertoire que Android.mk) et listez tous les modules comme dans l'exemple suivant:

APP_MODULES := <module_name_1> <module_name_2> ... <module_name_n>
45
répondu Reimund 2010-06-02 11:54:00

En réponse à

Pouvez-vous générer une bibliothèque statique (.un fichier) sans bibliothèque partagée qui l'utilise?

(qui aurait vraiment dû être sa propre question), la réponse est oui.

Par défaut, le NDK ne construira que des exécutables et des bibliothèques partagées (avec leurs dépendances bien sûr). Vous pouvez cependant forcer le NDK à construire une bibliothèque statique autonome en la référençant explicitement dans votre Application.mk.

En supposant votre module de bibliothèque statique est LOCAL_MODULE: = libXYZ, ajoutez la ligne suivante à Application.mk (création du fichier dans le même dossier que votre Android.mk si elle n'existe pas):

APP_MODULES := XYZ

Remarque la valeur APP_MODULES n'inclut pas le préfixe lib inclus dans le nom de votre module de bibliothèque statique.

Sinon, si vous ne voulez pas créer une Application.mk, vous pouvez spécifier la valeur sur la ligne de commande: ndk-build APP_MODULES=XYZ

8
répondu adelphus 2014-03-04 12:59:56

Un truc cool: si vous avez un Android.mk fichier, vous pouvez changer le type de construction à partir de:

include $(BUILD_SHARED_LIBRARY)

À

include $(BUILD_STATIC_LIBRARY)

Et .a bibliothèques seront sorties dans le dossier obj / dans leurs architectures respectives lorsque vous ndk-build la bibliothèque.

2
répondu Lake 2015-06-18 03:18:27