您需要将使用
ndk-build
生成的最终共享库与您已经编译为ARM架构的PDF共享库链接起来。(
请确保是这种情况,否则该库将无法在Android上运行!)
为此,例如,如果您有以下目录结构:
jni
└── libs
└────── my_shared_lib.so
└── Android.mk
└── Application.mk
你需要在Android.mk文件中添加以下内容:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := mysharedlib
LOCAL_SRC_FILES := libs/my_shared_lib.so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := mynativelib
LOCAL_LDLIBS := -landroid -llog
LOCAL_CPPFLAGS := -O0 -g3 -std=c++11 -Wall -Wextra
LOCAL_SHARED_LIBRARIES := mysharedlib
LOCAL_C_INCLUDES := myheader1.h myheader2.h
LOCAL_SRC_FILES := src_file1.cpp src_file2.cpp
include $(BUILD_SHARED_LIBRARY)
以下是使用C++标准库并为两种不同版本的ARM架构构建最终共享库所需的Application.mk文件内容:
APP_OPTIM := debug
APP_PLATFORM := android-14
APP_STL := gnustl_static
APP_ABI := armeabi armeabi-v7a
在Eclipse中编译代码或使用ndk-build脚本从命令行编译代码后,会生成最终共享库并将其链接到预构建的共享库(即您要使用的PDF共享库)。对于共享库而言,生成和部署到设备/模拟器的apk包含最终共享库以及所有链接到的预构建共享库,与链接静态库不同,静态库没有打包在apk包内。在您的用例中,apk解压后应该在Android应用程序的lib目录中有两个共享库。您可以通过从终端运行以下命令来检查这一点:
adb shell ls -l /data/data/com.company.myapp/lib
将com.company.myapp替换为您的应用程序包名。
此外,不要忘记将以下内容放置在Java类的静态上下文中:
class MyClass
{
static
{
try
{
System.loadLibrary("mynativelib");
}
catch (UnsatisfiedLinkError ule)
{
Log.e(TAG, "WARNING: Could not load native library: "
+ ule.getMessage());
}
}
}
注意在System.loadLibrary方法调用中使用与最终共享库名称相同的名称。