【发布时间】:2019-04-03 12:37:57
【问题描述】:
我正在尝试从 c_speech_features C library 为不同的 Android ABI 创建共享库。我已经下载了 Android NDK 并尝试按照 'Cross Compiling for Android' 的 cmake 说明创建 .so 库。
尝试的步骤:
-
将
CMakeLists.txt文件更改为cmake_minimum_required (VERSION 3.6) project (c_speech_features) include(GNUInstallDirs) ### I ADDED THESE VARIABLES TO COMPILE FOR ANDROID ### set(CMAKE_SYSTEM_NAME Android) set(CMAKE_SYSTEM_VERSION 23) set(CMAKE_ANDROID_ARCH_ABI armeabi-v7a) set(CMAKE_ANDROID_NDK /path_to/android-ndk-r18b/) option (ENABLE_DOUBLE "Enable double-precision floats" OFF) if (ENABLE_DOUBLE) set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Dkiss_fft_scalar=double") endif () configure_file ("c_speech_features_config.h.in" "c_speech_features_config.h") add_library (objlib OBJECT c_speech_features.c kiss_fft130/kiss_fft.c kiss_fft130/tools/kiss_fftr.c) set_property (TARGET objlib PROPERTY POSITION_INDEPENDENT_CODE 1) include_directories (kiss_fft130 kiss_fft130/tools) add_library (c_speech_features SHARED $<TARGET_OBJECTS:objlib>) add_library (c_speech_features_static STATIC $<TARGET_OBJECTS:objlib>) - 在终端打开源目录
- 跑
cmake - 跑
make
但是,无论我将ANDROID_ARCH_ABI 设置为什么,在运行cmake 和make 之后,生成的.so 库的ABI 始终与未在@ 中设置上述变量时相同987654338@ 文件。结果如下:
~$ readelf -h libc_speech_features.so | grep 'Class\|File\|Machine'
Class: ELF64
Machine: Advanced Micro Devices X86-64
我已尝试在库存储库的新下载时执行此操作,因此不认为缓存的 CMake 文件有问题。
是否可以通过这种方式为不同的 ABI 架构创建 .so 库?如果是这样,我应该如何改变我的方法?如果有其他方法来编译库,我也很乐意尝试。以下是我所做的其他一些尝试。
在 Tsyvarev 评论后编辑
我已经从CMakeLists.txt 文件中删除了设置变量,现在我正在尝试通过运行命令来使用工具链文件
cmake -DCMAKE_TOOLCHAIN_FILE=/path_to/android-ndk-r18b/build/cmake/android.toolchain.cmake \
-DCMAKE_ANDROID_NDK=/path_to/android-ndk-r18b \
-DANDROID_PLATFORM=android-24 -DCMAKE_ANDROID_ARCH_ABI=x86 \
.
然后我运行make 来构建.so 文件。但是现在生成的.so lib 始终是:
Class: ELF32
Machine: ARM
我是否错误地设置了所需的架构?使用 cmake 工具链时应该如何改变架构?
其他尝试
我已经看到有许多其他方法可以在 Android 应用程序中包含 C 库:
我没有成功直接添加 C 代码并构建 使用 Android Studio (docs description) 的库,因为我不能 访问任何方法。我确信这种方式是可行的,但现在已经了解如何包含和使用预先存在的
.so库,因此创建一个可能会更容易。Android NDK standalone toolchains我还没看懂怎么弄 在这个 C 库上运行,其
CMakeLists.txt定义了 图书馆建成我看到android-cmake 经常被提及,我可能很笨 在这里但可以从自述文件中看到如何使用它(它也很旧 所以可能并不比直接使用cmake更好)。
我认为使用 Android.mk 并不容易,因为我有一个库 已经有了
CMakeLists.txt文件,所以转换它似乎 喜欢更多的工作
【问题讨论】:
-
一个 .so 文件是为它构建的任何 ABI 构建的;这不是你事后改变的东西。如果您想为其他 ABI 构建该库,您需要从源代码构建它。您提到您这样做没有成功,但您没有向我们确切展示您尝试了什么或遇到了哪些具体错误。
-
CMake instructions 你指的是关于工具链文件,应该通过
cmake的-DCMAKE_TOOLCHAIN_FILE=...选项使用。set(CMAKE_SYSTEM_NAME Android)之类的变量设置不应在CMakeLists.txt文件中使用,它们用于工具链文件。 -
我以为我正在尝试从源代码构建它。我可能一直不清楚。我添加的步骤试图更清楚地显示我所做的。
-
标签: android c cmake android-ndk cross-compiling