Переименование зависимой библиотеки в Android NDK вызывает UnsatisfiedLinkError - PullRequest
2 голосов
/ 16 января 2012

Я занимаюсь разработкой приложения для Android с использованием Android NDK. Уровень JNI приложения зависит от общей библиотеки libDependentLib.so. Мой android.mk выглядит так:

LOCAL_PATH := $(call my-dir)
include $(call all-subdir-makefiles)
include $(CLEAR_VARS)
TARGET_PLATFORM := 'android-10'
LOCAL_CPP_EXTENSION := .cpp
LOCAL_CPPFLAGS += -fno-exceptions -fno-rtti         
MY_LOCAL_PATH := $(LOCAL_PATH)/../
LOCAL_LDLIBS := -L$(call host-path, $(MY_LOCAL_PATH)/libs) -lDependentLib
LOCAL_C_INCLUDES := $(MY_LOCAL_PATH)/include-all $(MY_LOCAL_PATH)/include
MY_FILES := abc.cpp xyz.cpp
LOCAL_LDLIBS    += -lm -llog  -lstdc++
LOCAL_SRC_FILES += $(MY_FILES)
LOCAL_MODULE    := jniLayer
include $(BUILD_SHARED_LIBRARY)

Моя структура каталогов для библиотек:

<Android_Project>
       |
     libs----armeabi-----libjniLayer.so
       |       |---------libstlport_shared.so
       |-----------------libDependentLib.so

Каждый раз, когда я копирую libDependentLib.so в armeabi перед запуском приложения. Загрузка библиотек выполняется как:

static {
    try {
        /* loading the libraries */
        System.loadLibrary("stlport_shared");
        System.loadLibrary("DependentLib");
        System.loadLibrary("jniLayer");
    } catch (Throwable th) {
        th.printStackTrace();
    }
}

Это работает нормально. Но из-за некоторых требований я вынужден изменить имя внешней библиотеки на DependentLib_1. Я переименовал то же самое в Android.mk, загружая библиотеки в java и имя библиотеки в AndroidProject. Но приложение терпит неудачу в System.loadLibrary ("jniLayer"); говоря

java.lang.UnsatisfiedLinkError: Cannot load library: link_image[1966]:88 could not load needed library 'libDependentLib.so' for 'libjniLayer.so'    (load_library[1108]: Library 'libDependentLib.so' not found)

Я не могу понять, почему все еще ищется libDependentLib.so. Я переименовал все в libDependentLib_1.so. Так что то же самое следует искать. Помимо загрузки Andorid.mk и jni, где упоминается libDependentLib.so? Примечание: проект Android содержит новую библиотеку lib

1 Ответ

0 голосов
/ 13 марта 2013

Ваш libjniLayer.so зависит от libDependentLib.so?
Если это так, вы не можете переименовать libDependentLib.so , потому что при сборке libjniLayer.so компоновщик ставит имя зависимого .so (libDependentLib.so) в объектном коде. Поэтому, если вы переименуете libDepenedentLib.so, jniLayer.so все равно будет искать libDependentLib.so.

...