Android NDK-build: не удалось загрузить предварительно собранную разделяемую библиотеку как зависимость другого модуля - PullRequest
0 голосов
/ 18 апреля 2019

Я пытался выполнить некоторые собственные сборки библиотек для моего приложения для Android.Более конкретно, выполнение ndk-build с помощью некоторых готовых разделяемых библиотек.Один из модулей (назовем его pyjni) зависит от этих готовых разделяемых библиотек.Поэтому мой Android.mk состоит из двух модулей для предварительно собранных и подлежащих сборке библиотек соответственно, как рекомендуется для android ndk development .

Это мой файл Android.mk для приложения:

LOCAL_PATH := $(call my-dir)
TARGET_ARCH_ABI := armeabi-v7a

include $(CLEAR_VARS)
LOCAL_SRC_FILES :=  $(LOCAL_DIR)/libs/$(TARGET_ARCH_ABI)/libprebuilt.so
LOCAL_MODULE := prebuilt
include $(PREBUILT_SHARED_LIBRARY)


# Build libpyjni.so
include $(CLEAR_VARS)
LOCAL_MODULE    := pyjni
LOCAL_SRC_FILES := pyjni.c
LOCAL_C_INCLUDES:= $(LOCAL_DIR)/include/$(TARGET_ARCH_ABI)/
LOCAL_SHARED_LIBRARIES := prebuilt
LOCAL_LDLIBS += -llog
include $(BUILD_SHARED_LIBRARY)

Сборка получается нормально.На самом деле, при проверке .APK как готовые, так и встроенные общие библиотеки упаковываются в @ lib / armeabi-v7a.Пока все хорошо.

Однако при попытке загрузить встроенную разделяемую библиотеку как System.loadLibrary ("pyjni") во время выполнения приложения происходит сбой, сообщая о следующей ошибке: java.lang.UnsatisfiedLinkError: dlopen failed: library ".../app/build/intermediates/ndkBuild/debug/obj/local/armeabi-v7a/libprebuilt.so" not found.

Я могу успешно загрузить предварительно собранную библиотеку, используя System.loadLibrary ("prebuilt").Поэтому на данный момент я подозреваю, что проблема заключается в том, как упаковывается готовая разделяемая библиотека или, скорее, как работает LOCAL_SHARED_LIBRARIES.В файле build.gradle приложения sourceSets.main.jniLibs.srcDirs указывает на каталог, в котором находится libprebuilt.so.Чтобы избежать проблем с упаковкой с несколькими экземплярами предварительно скомпилированного файла библиотеки, в файле gradle указывается

packagingOptions{
        pickFirst 'lib/armeabi-v7a/libprebuilt.so'
    }

. На данный момент я запутался с тем, как ссылка, созданная LOCAL_SHARED_LIBRARIES, работает при выполнении.

...