Android NDK 和 .so.X 扩展

Android NDK and .so.X extensions

我正在尝试在 Android NDK 应用程序中使用 Grantlee 库。

我可以很好地编译 Grantlee,我得到 libGrantlee_Templates.solibGrantlee_Templates.so.5libGrantlee_Templates.so.5.0.0

这三个中,我只能安装第一个Android.mk:

include $(CLEAR_VARS)
LOCAL_MODULE := libgrantlee
LOCAL_SRC_FILES := $(GRANTLEE_PATH)/lib/libGrantlee_Templates.so
include $(PREBUILT_SHARED_LIBRARY)

因为如果我尝试安装其他两个中的任何一个,那么我会得到:

Android NDK: ERROR:Android.mk:grantlee: LOCAL_SRC_FILES should point to a file ending with ".so"
Android NDK: The following file is unsupported: libGrantlee_Templates.so.5

但是,就像一个残酷的笑话,我无法安装的 .so.5 正是它在运行时寻找的文件:

E/AndroidRuntime(14439): java.lang.UnsatisfiedLinkError: dlopen failed: could not load library "libGrantlee_Templates.so.5"; caused by library "libGrantlee_Templates.so.5" not found

我该如何解决?

当您使用 NDK 独立工具链构建原生共享库时,您必须更改其 make 文件以删除 .version 后缀。例如,看看这是如何 done for ffmpeg.

如果库是使用基于 autotools/libtool 的构建系统构建的,请将捆绑的 libtool 更新为 libtool 2.4.3 或更新版本。这些版本知道如何处理有关 android 共享库的这些细节,因此如果您使用 --host=arm-linux-androideabi 或类似的方式构建它,它不会向库添加任何版本号。

要升级源包中的 libtool 版本,运行 例如autogen.sh 或源包中的类似脚本,或 autoreconf -fi,假设您在周围系统中安装了足够新版本的 libtool。

我在项目中使用外部库时遇到了同样的问题。

您还可以将 -avoid-version 添加到 libtool 命令。这个技巧救了我一命...