¿Cómo vincular una biblioteca compartida premontada a un proyecto NDK de Android?
android ndk (4)
Aquí utilicé este archivo jni/
en jni/
folder.
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)
Y lib
una carpeta lib
en el directorio del proyecto y ponga mi biblioteca Android.mk
y haga un archivo Android.mk
que contenga lo siguiente
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)
Y cuando uso el ndk-build -B
obtengo una referencia indefinida a packageExtraction . Aquí utilizo las funciones de mi biblioteca preintegrada, lo que significa que no puedo vincular mi biblioteca compartida offlinedownload
a mi biblioteca fuera de línea.
Así que cualquier cuerpo por favor ayúdame a resolver este problema.
Aquí hay un archivo completo de Android.mk para usar una biblioteca compartida de terceros. La biblioteca (libffmpeg.so) se coloca en la carpeta jni. Su "LOCAL_EXPORT_C_INCLUDES" especifica dónde se guardan los archivos de encabezado para la biblioteca.
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 quisiera soportar múltiples arquitecturas, entonces podría especificar:
APP_ABI := armeabi armeabi-v7a x86 mips
en su jni / Application.mk y cambie LOCAL_SRC_FILES a algo como:
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libffmpeg.so
y coloque un libffmpeg.so en jni / armeabi / libffmpeg.so, jni / armeabi-v7a / libffmpeg.so etc.
Eche un vistazo a la documentación de ndk para precalculos:
android-ndk / docs / PREBUILTS.html
Tienes que cambiar
LOCAL_SHARED_LIBRARIES :=../lib/libpackext.so.1.0
a
LOCAL_SHARED_LIBRARIES := packext
Asegúrese de que su carpeta que contiene el Android.mk para el módulo packext se llame packext y se pueda encontrar en su NDK_MODULE_PATH.
Tienes que hacer uno de los siguientes:
Corta y pega todo, excepto LOCAL_PATH: = $ (call my-dir) desde tu segundo Android.mk en tu primer.
Ponga lo siguiente al final de su primer Android.mk:
$ (llamada import-module, packext)
Asegúrese también de establecer su variable de entorno NDK_MODULE_PATH en una ruta donde se pueda encontrar el archivo Android.mk que define el paquete de módulo.
También tienes que cambiar LOCAL_SHARED_LIBRARIES de la misma manera que mgiza dijo en la primera respuesta. Supongo que el packageExtraction al que recibió una referencia indefinida está en su biblioteca precompilada, de modo que, a menos que tenga otros problemas de enlace, esto debería resolver el problema.
Android NDK oficial hello-libs
CMake ejemplo
Solo trabajé para mí en Ubuntu 17.10 host, Android Studio 3, Android SDK 26, NDK 15.2. así que recomiendo encarecidamente que bases tu proyecto en él.
La biblioteca compartida se llama libgperf
, las partes del código clave son:
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)
en el código C ++, use:
#include <gperf.h>
ubicación del encabezado:
hello-libs/distribution/gperf/include/gperf.h
ubicación lib:
distribution/gperf/lib/arm64-v8a/libgperf.so
android { sourceSets { main { // let gradle pack the shared library into apk jniLibs.srcDirs = [''../distribution/gperf/lib'']
Luego, si busca debajo de
/data/app
en el dispositivo,libgperf.so
también estará allí.Si solo admite algunas arquitecturas, consulte: Gradle Build NDK target only ARM
El ejemplo git rastrea las bibliotecas compartidas creadas previamente, pero también contiene el sistema de compilación para construirlas también: https://github.com/googlesamples/android-ndk/tree/840858984e1bb8a7fab37c1b7c571efbe7d6eb75/hello-libs/gen-libs