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

时间:2011-06-17 19:02:44

标签: android android-ndk

我正在尝试构建一个现有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)

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

尝试使用libpng12.so加载System.loadLibrary。在加载jni库之前执行此操作,以便已加载所有需要的符号。