从Android上的JNI库引用预构建的共享库

问题描述:

我想构建一个JNI接口到现有的C++代码库。我已经为我的JNI函数成功构建了一个.so文件,并且可以在Java代码中成功调用该函数。从Android上的JNI库引用预构建的共享库

当我转到下一步,即调用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:= $(叫我-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) 

预先感谢任何帮助。

尝试使用System.loadLibrary加载libpng12.so。在加载你的jni库之前这样做,以便所有需要的符号都已经加载。