Android NDK 和 .so.X 扩展
Android NDK and .so.X extensions
我正在尝试在 Android NDK 应用程序中使用 Grantlee 库。
我可以很好地编译 Grantlee,我得到 libGrantlee_Templates.so
、libGrantlee_Templates.so.5
和 libGrantlee_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 命令。这个技巧救了我一命...
我正在尝试在 Android NDK 应用程序中使用 Grantlee 库。
我可以很好地编译 Grantlee,我得到 libGrantlee_Templates.so
、libGrantlee_Templates.so.5
和 libGrantlee_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 命令。这个技巧救了我一命...