web-dev-qa-db-fra.com

NDK - Comment utiliser une bibliothèque .so générée dans un autre projet

J'ai utilisé ndk avec succès pour créer et utiliser un .so fichier dans un projet. J'ai besoin d'utiliser cette bibliothèque dans un autre projet. Je préfère ne pas copier la source là-bas, mais simplement utiliser la bibliothèque.

Essayer de copier et coller le tout libs/armeabi/libcommon.so à la racine du projet ne fonctionne pas, je pense parce que libs/armeabi est un chemin Android généré.

Alors, quelle serait la meilleure façon de procéder?

J'utilise Eclipse-Galileo & ndk5.

43
OceanBlue

J'ai trouvé un moyen de le faire, alors postez-le ici au cas où quelqu'un d'autre le rencontrerait.

  1. Le code à partager (y compris le Java JNI, code natif, bibliothèque .so), doit être dans un projet distinct. Convertissez-le en projet de bibliothèque en cliquant avec le bouton droit sur le nom du projet - -> propriétés -> Android propriétés -> cochez "Is Library". Ce projet ne peut pas être exécuté maintenant mais peut être référencé par d'autres projets.

  2. Dans le projet qui utilisera l'objet partagé, ajoutez une référence au projet Libarray en cliquant avec le bouton droit sur le nom du projet -> propriétés -> Android propriétés -> Bibliothèque/"Ajouter" . Cela devrait afficher le projet de bibliothèque créé à l'étape précédente. Sélectionnez-le.

Maintenant, le .so peut être référencé facilement entre différents projets.

20
OceanBlue

Il existe un moyen beaucoup plus simple de faire tout cela.

Disons que votre bibliothèque précompilée s'appelle "libprebuilt.so"

Dans le dossier de projet du nouveau projet que vous souhaitez inclure uniquement la bibliothèque précompilée, faites quelque chose comme:

mkdir -p jni/libprebuilt
cp libprebuilt.so jni/libprebuilt

Ensuite, créez simplement un fichier jni/libprebuilt/Android.mk:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := libprebuilt
LOCAL_SRC_FILES := libprebuilt.so
include $(PREBUILT_SHARED_LIBRARY)

Ensuite, lorsque vous faites ndk-build, il copiera cette bibliothèque dans libs/armeabi/... c'est tout!

44
gnychis

Il y a un nom de package dans tous les noms de fonctions JNI (Java Native Interface) (comme JNIEXPORT void JNICALL Java_com_myapp_myclass_funct). Donc je suppose que vous devriez renommer ces funkcions dans la bibliothèque et les recompiler. Ou peut-être l'utiliser comme package externe dans votre application.

7
Komi