2012-03-26 2 views
19

Здесь я использовал этот файл Android.mk в папке jni/.Как связать предварительно созданную общую библиотеку с проектом Android NDK?

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.

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

+0

Может вы подробно объясните свой вопрос? – Nimit

ответ

0

Посмотрите документацию NDK для prebuilts:

андроид-NDK/Docs/PREBUILTS.html

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

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

в

LOCAL_SHARED_LIBRARIES := packext 

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

+0

Здесь я помещаю свои Android.mk и libpackext.so.1.0 в папку lib. Эта папка lib находится в каталоге проекта path.where я делаю папку jni – user1089679

2

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

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

  2. Вставьте следующий в конце первого Android.mk:

    $ (вызов импортно-модуль, packext)

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

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

33

Полный файл 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.тк и изменить LOCAL_SRC_FILES к чему-то вроде:

LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libffmpeg.so 

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

+0

Почему libffmpeg.so должен быть в папке jni? Со всеми архитектурами, как сделать это проще? – xgdgsc

+1

Я изменил пример, чтобы показать, как поддерживать несколько архитектур. –

+0

@danbrough Мне нужна ваша помощь –

0

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, ключевые части кода являются:

  • 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 target only ARM

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

Смежные вопросы