Подтвердить что ты не робот

Как связать предварительно созданную общую библиотеку с проектом Android NDK?

Здесь я использовал этот Android.mk файл в папке 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)

И создайте одну папку lib в каталоге проекта и поместите мою предварительно созданную библиотеку .so и создайте один Android.mk файл, содержащий следующие

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)

И когда я использую команду ndk-build -B, чем я получил ссылку undefined на packageExtraction. Здесь я использую свои готовые функции библиотеки, поэтому я не могу связать свою предварительно созданную общую библиотеку с моей библиотекой offlinedownload.

Итак, любой орган, пожалуйста, помогите мне решить эту проблему.

4b9b3361

Ответ 1

Вот полный файл Android.mk для использования сторонней общей библиотеки. Библиотека (libffmpeg.so) помещается в папку jni. Его "LOCAL_EXPORT_C_INCLUDES" указывает, где хранятся файлы заголовков для библиотеки.

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)

Если вы хотите поддерживать несколько архитектур, вы можете указать:

APP_ABI := armeabi armeabi-v7a x86 mips

в вашем jni/Application.mk и измените LOCAL_SRC_FILES на что-то вроде:

LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libffmpeg.so

и поместите libffmpeg.so в jni/armeabi/libffmpeg.so, jni/armeabi-v7a/libffmpeg.so и т.д.

Ответ 2

Вам нужно выполнить одно из следующих действий:

  • Вырезать и вставить все, кроме LOCAL_PATH: = $(вызов my-dir) со второго Android.mk, в первую очередь.

  • Поместите следующее в конце вашего первого Android.mk:

    $(вызов import-module, packext)

    Также убедитесь, что вы установили переменную среды NDK_MODULE_PATH в путь, где можно найти файл Android.mk, определяющий пакет packext.

Вы также должны изменить LOCAL_SHARED_LIBRARIES так же, как сказал mgiza в первом ответе. Я полагаю, что packageExtraction, с которым вы получили ссылку undefined, находится в вашей предварительно сконструированной библиотеке, поэтому, если у вас нет других проблем с связыванием, это должно решить проблему.

Ответ 3

Взгляните на документацию ndk для предварительных построек:

андроид-NDK/документы/PREBUILTS.html

Вы должны изменить

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

к

LOCAL_SHARED_LIBRARIES := packext

Убедитесь, что ваша папка, содержащая Android.mk для модуля packext, называется packext и может быть найдена в вашем NDK_MODULE_PATH.

Ответ 4

Официальный анонс Android NDK hello-libs Пример CMake

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

Просто работал у меня на хосте Ubuntu 17.10, Android Studio 3, Android SDK 26, NDK 15.2. поэтому я настоятельно рекомендую вам основывать свой проект на нем.

Общая библиотека называется libgperf, key code части:

  • 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)
    
  • на С++-коде, используйте: #include <gperf.h>

  • расположение заголовка: hello-libs/distribution/gperf/include/gperf.h

  • Местоположение: 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']
    

    Затем, если вы посмотрите на /data/app на устройстве, там будет libgperf.so.

  • Если вы поддерживаете только некоторые архитектуры, см. Gradle Создание только NDK-цели только ARM

Пример git отслеживает готовые совместно используемые библиотеки, но он также содержит систему сборки, чтобы фактически их создать: https://github.com/googlesamples/android-ndk/tree/840858984e1bb8a7fab37c1b7c571efbe7d6eb75/hello-libs/gen-libs