我正在尝试构建一个现有C ++代码库的JNI接口。我已成功为我的JNI函数构建了一个.so文件,并且可以在Java代码中成功调用该函数。
当我进入下一步,即调用libpng中的函数(使用NDK工具链编译为.so文件)时,我能够成功构建与我的JNI函数关联的共享库,并且.MK文件导致libpng12.so被复制到libs / armeabi目录中。
将应用程序部署到模拟器会将JNI .so和libpng.so放入/ data下的应用程序文件夹的lib目录中。为我的JNI库调用System.loadLibrary会导致在我的应用程序的lib目录中找到该代码。
但是,当代码尝试访问libpng.so文件时,我会收到UnsatisfiedLinkError。在模拟器上使用strace,我看到它正在尝试从/ system / lib加载libpng.so,而不是从加载JNI库的相同位置加载。
有没有办法控制从哪里加载引用的库?它们似乎不应该安装在/ system / lib中;部署应用程序将引用的.so文件放在应用程序的lib目录中的事实似乎表明它会在那里找到。
对于它的价值,这是我们使用的.MK文件: LOCAL_PATH:= $(调用my-dir)
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)
提前感谢您的帮助。
答案 0 :(得分:0)
尝试使用libpng12.so
加载System.loadLibrary
。在加载jni库之前执行此操作,以便已加载所有需要的符号。