Я пытаюсь создать интерфейс JNI для существующей базы кода C ++. Я успешно создал файл .so для своей функции JNI и могу успешно вызывать эту функцию из кода Java.
Когда я перехожу к следующему шагу, а именно к вызову функции в libpng (скомпилированной в файл .so с цепочкой инструментов NDK), я могу успешно создать общую библиотеку, связанную с моей функцией JNI, и Файл .MK приводит к тому, что libpng12.so копируется в каталог libs / armeabi, как и должно быть.
Развертывание приложения в эмуляторе помещает как JNI .so, так и libpng.so в каталог lib папки приложения в / data. Вызов System.loadLibrary для моей библиотеки JNI приводит к тому, что этот код находится в каталоге lib моего приложения.
Однако я получаю UnsatisfiedLinkError, когда код пытается получить доступ к файлу libpng.so. Используя strace на эмуляторе, я вижу, что он пытается загрузить libpng.so из / system / lib, а не из того же места, откуда была загружена библиотека JNI.
Есть ли способ контролировать, откуда загружаются ссылочные библиотеки? Не похоже, что они должны быть установлены в / system / lib; тот факт, что развертывание приложения помещает указанный .so-файл в каталог lib приложения, указывает на то, что он будет там найден.
Для чего это стоит, вот файл .MK, который мы используем:
LOCAL_PATH: = $ (позвоните в мою директорию)
include $(CLEAR_VARS)
LOCAL_MODULE := png12
LOCAL_SRC_FILES := libpng12.so
LOCAL_EXPORT_C_INCLUDES := /home/jipping/libpng-1.2.44
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := PNGLib
LOCAL_SRC_FILES := PNGLib.cpp
LOCAL_SHARED_LIBRARY := png12
LOCAL_LDLIBS := -L/cygdrive /c/Users/mcfall/workspace/AndroidCalculator/jni -lpng12
LOCAL_C_INCLUDES := /home/mcfall/libpng-1.2.44
include $(BUILD_SHARED_LIBRARY)
Заранее спасибо за любую помощь.