¿Cómo vincular una biblioteca compartida precomstackda a un proyecto Android NDK?

Aquí usé este archivo jni/ en jni/ carpeta.

 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 coloca mi biblioteca Android.mk y Android.mk un archivo Android.mk que contiene los siguientes

 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 no definida a packageExtraction . Aquí utilizo las funciones de biblioteca precomstackdas, lo que significa que no puedo vincular mi biblioteca compartida offlinedownload a mi biblioteca de offlinedownload .

Entonces 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-androidabi4.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 desea admitir varias architectures, puede 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 coloca un libffmpeg.so en jni / armeabi / libffmpeg.so, jni / armeabi-v7a / libffmpeg.so etc.

Tienes que hacer cualquiera de los siguientes:

  1. Corta y pega todo excepto LOCAL_PATH: = $ (call my-dir) desde tu segundo Android.mk al primero.

  2. Pon lo siguiente al final de tu primer Android.mk:

    $ (llamada import-module, packext)

    También asegúrese de establecer su variable de entorno NDK_MODULE_PATH en una ruta donde se encuentre el archivo Android.mk que define el paquete packext.

También debe cambiar los LOCAL_SHARED_LIBRARIES de la misma manera que dijo mgiza en la primera respuesta. Supongo que el paquete de extracción al que tienes referencia indefinida está en tu biblioteca precomstackda, así que, a menos que tengas otros problemas de vinculación, esto debería resolver el problema.

Android NDK oficial hello-libs CMake ejemplo

https://github.com/googlesamples/android-ndk/tree/840858984e1bb8a7fab37c1b7c571efbe7d6eb75/hello-libs

Acabo de trabajar para mí en el host Ubuntu 17.10, Android Studio 3, Android SDK 26, NDK 15.2. así que le recomiendo encarecidamente que base su 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 código C ++, use: #include

  • Ubicación del encabezado: hello-libs/distribution/gperf/include/gperf.h

  • ubicación lib: 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'] 

    Luego, si miras en /data/app en el dispositivo, libgperf.so estará allí también.

  • Si solo admite algunas architectures, consulte: Gradle Build NDK target only ARM

El git de ejemplo rastrea las bibliotecas compartidas previamente comstackdas, pero también contiene el sistema de comstackción para construirlas también: https://github.com/googlesamples/android-ndk/tree/840858984e1bb8a7fab37c1b7c571efbe7d6eb75/hello-libs/gen-libs

Eche un vistazo a la documentación de ndk para prebuilt:

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 Android.mk para el módulo de texto de paquete se llame packext y se encuentre en su NDK_MODULE_PATH.