web-dev-qa-db-fra.com

Comment lier une bibliothèque partagée prédéfinie à un projet Android NDK?

Ici, j'ai utilisé ce fichier Android.mk dans le dossier jni/.

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

# Here we give our module name and source file(s)
LOCAL_MODULE    := offlineDownload
LOCAL_SRC_FILES := offline_download.c

LOCAL_SHARED_LIBRARIES :=../lib/libpackext.so.1.0
LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog

include $(BUILD_SHARED_LIBRARY)

Et créez un dossier lib dans le répertoire du projet et placez ma bibliothèque .so pré-construite et créez un fichier Android.mk qui contient les éléments suivants:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := packext
LOCAL_SRC_FILES := libpackext.so.1.0
LOCAL_C_INCLUDES := $(LOCAL_PATH)/../include

include $(PREBUILT_SHARED_LIBRARY)

Et quand j’utilise la commande ndk-build -B que j’ai eu référence non définie à packageExtraction . Ici, j'utilise les fonctions de bibliothèque prédéfinies signifiant que je ne peux pas lier ma bibliothèque partagée prédéfinie à ma bibliothèque offlinedownload.

Alors, n’importe quel organisme, aidez-moi à résoudre ce problème.

20
user1089679

Voici un fichier Android.mk complet pour utiliser une bibliothèque partagée tierce partie ..__ La bibliothèque (libffmpeg.so) est placée dans le dossier jni . Son "LOCAL_EXPORT_C_INCLUDES" spécifie où les fichiers d'en-tête sont conservés .

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := ffmpeg
LOCAL_SRC_FILES := libffmpeg.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/../../ffmpeg/libs/arm-linux-androideabi4.7_1/include
include $(PREBUILT_SHARED_LIBRARY)


include $(CLEAR_VARS)
LOCAL_MODULE    := ffmpegandroid
LOCAL_SRC_FILES := ffmpegandroid.c
LOCAL_SHARED_LIBRARIES := ffmpeg
include $(BUILD_SHARED_LIBRARY)

Si vous souhaitez prendre en charge plusieurs architectures, vous pouvez spécifier: 

APP_ABI := armeabi armeabi-v7a x86 mips

dans votre jni/Application.mk et remplacez LOCAL_SRC_FILES par quelque chose comme:

LOCAL_SRC_FILES := $(TARGET_Arch_ABI)/libffmpeg.so

et placez un libffmpeg.so à jni/armeabi/libffmpeg.so, jni/armeabi-v7a/libffmpeg.so etc.

35
Dan Brough

Vous devez effectuer l'une des opérations suivantes:

  1. Tout couper et coller sauf LOCAL_PATH: = $ (appeler my-dir) de votre deuxième Android.mk dans votre premier. 

  2. Mettez ce qui suit à la fin de votre premier Android.mk:

    $ (appel import-module, packext)

    Assurez-vous également que vous définissez votre variable d’environnement NDK_MODULE_PATH sur un chemin où se trouve le fichier Android.mk définissant le module module.

Vous devez également modifier LOCAL_SHARED_LIBRARIES de la même manière que mgiza dans la première réponse. Je suppose que le packageExtraction auquel vous faites référence indéfinie se trouve dans votre bibliothèque prédéfinie, donc à moins que vous n'ayez d'autres problèmes de liaison, cela devrait résoudre le problème.

2
Jake

Android NDK officiel hello-libs Exemple de CMake

_ { https://github.com/googlesamples/Android-ndk/tree/840858984e1bb8a7fab37c1b7c571efbe7d6eb75/hello-libs }

Je viens de travailler pour moi sur Ubuntu 17.10 Host, Android Studio 3, Android SDK 26, NDK 15.2. Je vous recommande donc fortement de baser votre projet sur celui-ci.

La bibliothèque partagée s'appelle libgperf, les parties de code de clé sont les suivantes:

  • hello-libs/app/src/main/cpp/CMakeLists.txt

    // -L
    add_library(lib_gperf SHARED IMPORTED)
    set_target_properties(lib_gperf PROPERTIES IMPORTED_LOCATION
              ${distribution_DIR}/gperf/lib/${Android_ABI}/libgperf.so)
    
    // -I
    target_include_directories(hello-libs PRIVATE
                               ${distribution_DIR}/gperf/include)
    // -lgperf
    target_link_libraries(hello-libs
                          lib_gperf)
    
  • sur le code C++, utilisez: #include <gperf.h>

  • emplacement de l'en-tête: hello-libs/distribution/gperf/include/gperf.h

  • emplacement de la bibliothèque: distribution/gperf/lib/arm64-v8a/libgperf.so

  • app/build.gradle :

    Android {
        sourceSets {
            main {
                // let gradle pack the shared library into apk
                jniLibs.srcDirs = ['../distribution/gperf/lib']
    

    Ensuite, si vous regardez sous /data/app sur le périphérique, libgperf.so sera également présent.

  • Si vous ne prenez en charge que certaines architectures, voir: cible NDK Gradle Build uniquement ARM }

L'exemple git suit les bibliothèques partagées prédéfinies, mais il contient également le système de construction permettant de les construire également: https://github.com/googlesamples/Android-ndk/tree/840858984e1bb8a7fab37c1b7c771debe7d6eb75/hello-bi libs

Jetez un coup d’œil à la documentation de ndk pour les pré-assemblages:

Android-ndk/docs/PREBUILTS.html

Tu dois changer

LOCAL_SHARED_LIBRARIES :=../lib/libpackext.so.1.0

à

LOCAL_SHARED_LIBRARIES := packext

Assurez-vous que votre dossier contenant Android.mk pour le module packext s'appelle packext et se trouve dans votre NDK_MODULE_PATH.

0
mgiza