您必须将由 Android NDK 生成的最终共享库链接到您说您已经为 ARM 架构编译ndk-build
的 PDF 共享库。(确保是这种情况,否则该库将无法在 Android 上运行!)
为此,例如,如果您具有以下目录结构:
jni
└── libs
└────── my_shared_lib.so
└── Android.mk
└── Application.mk
您需要在Android.mk文件中包含以下内容:
LOCAL_PATH := $(call my-dir)
# define our prebuilt shared library as a module to the build system
include $(CLEAR_VARS)
LOCAL_MODULE := mysharedlib
LOCAL_SRC_FILES := libs/my_shared_lib.so
include $(PREBUILT_SHARED_LIBRARY)
# The final shared library that will be bundled inside the .apk
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)
以及Application.mk文件的内容(用于使用 C++ 标准库,并为两个不同版本的 ARM 架构构建最终的共享库):
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());
}
}
// other code here...
}
请注意在System.loadLibrary 方法调用中使用与最终共享库名称相同的名称。