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.
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.
Vous devez effectuer l'une des opérations suivantes:
Tout couper et coller sauf LOCAL_PATH: = $ (appeler my-dir) de votre deuxième Android.mk dans votre premier.
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.
Android NDK officiel hello-libs
Exemple de CMake
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
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.