web-dev-qa-db-fra.com

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

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

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

/cygdrive/c/Android-ndk-r4/build/platforms/Android-8/Arch-x86/usr/include/asm/posix_types.h:15:28: erreur: posix_types_64.h: aucun fichier ou répertoire de ce type

Comment puis-je faire fonctionner cela?

34
Reimund

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

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

Exemple d'un fichier Android.mk modifié 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 souhaitez contrôler les modules à compiler lorsque vous exécutez ndk-build, vous pouvez créer créer un fichier Application.mk (dans le même répertoire que Android.mk) et répertorier tous les modules comme suit exemple:

APP_MODULES := <module_name_1> <module_name_2> ... <module_name_n>
47
Reimund

En réponse à

Pouvez-vous générer une bibliothèque statique (fichier .a) 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 à créer une bibliothèque statique autonome en le référençant explicitement dans votre Application.mk.

En supposant que 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 s'il n'existe pas):

APP_MODULES := XYZ

Notez que 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 souhaitez pas créer un Application.mk, vous pouvez spécifier la valeur sur la ligne de commande: ndk-build APP_MODULES=XYZ

9
adelphus

Une astuce sympa: si vous avez un fichier Android.mk, vous pouvez changer le type de build de:

include $(BUILD_SHARED_LIBRARY)

à

include $(BUILD_STATIC_LIBRARY)

et les bibliothèques .a seront sorties dans le dossier obj/dans leurs architectures respectives lorsque vous construirez la bibliothèque ndk.

3
Lake