Как связать предварительно созданную общую библиотеку с проектом 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
.
Итак, любой орган, пожалуйста, помогите мне решить эту проблему.
Ответы
Ответ 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