Как связать готовую общую библиотеку с проектом Android NDK? - PullRequest
20 голосов
/ 26 марта 2012

Здесь я использовал этот 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, чем я получил неопределенная ссылка на packageExtraction .Здесь я использую свои готовые библиотечные функции, что означает, что я не могу связать свою готовую разделяемую библиотеку с моей offlinedownload библиотекой.

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

Ответы [ 4 ]

35 голосов
/ 01 марта 2013

Вот полный файл 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 голосов

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

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

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

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

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

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

  • 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']
    

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

  • Если вы поддерживаете только некоторые архитектурысм .: Gradle Build NDK только для цели ARM

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

2 голосов
/ 29 марта 2012

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

  1. Вырезать и вставить все, кроме LOCAL_PATH: = $ (call my-dir) из вашего второго Android.mk, в ваш первый.

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

    $ (call import-module, packext)

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

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

0 голосов
/ 28 марта 2012

Ознакомьтесь с документацией ndk для сборок:

android-ndk / docs / PREBUILTS.html

Вам необходимо изменить

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

на

LOCAL_SHARED_LIBRARIES := packext

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...