使用Cmake构建Android NDK项目

12

我希望使用Android NDK和Cmake生成我的Android本地应用程序,因此我下载了android-cmake工具链。

Cmake成功生成了我的项目,但是当我尝试进入生成的目录并运行"make"时,出现了以下错误:

-- Configuring done
-- Generating done
-- Build files have been written to: /Users/ldz/Desktop/myProject
[  1%] Building CXX object Project/src/Main/Core/CMakeFiles/Core.dir/Main/Main.cpp.o
arm-linux-androideabi-g++: error: unrecognized command line option '-stdlib=libc++'

我不知道这里出了什么问题,我的项目使用C++11,在这里是我的g++ --version结果:

Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 5.0 (clang-500.2.76) (based on LLVM 3.3svn)
Target: x86_64-apple-darwin12.5.0
Thread model: posix

谢谢!


你看过这个吗:https://dev59.com/mWYr5IYBdhLWcg3wGmeq? - JonasVautherin
3个回答

18
要使用Cmake构建Android NDK项目并创建APK,您需要执行以下操作:
  • 不要使用android-cmake,而是使用taka-no-me的fork
  • 然后使用pixellight的Apk.cmake。从该存储库中复制[AndroidManifest.xml.in、LoadLibraries.java.in、strings.xml.in]。
  • 像这样有一个CMakeLists.txt:
    cmake_minimum_required(VERSION 2.8.3) project(testBuilder) include("Apk.cmake" REQUIRED) include_directories(${ANDROID_NDK}/sources/android/native_app_glue) set(TEST_SRC ${ANDROID_NDK}/sources/android/native_app_glue/android_native_app_glue.c src/Main.cpp ) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x -ffor-scope -fno-rtti -fno-exceptions -pipe -ffunction-sections -fdata-sections -ffast-math -Wnon-virtual-dtor -Wreorder -Wsign-promo -fvisibility=hidden -fvisibility-inlines-hidden -Wstrict-null-sentinel -Os -funroll-all-loops -fpeel-loops -ftree-vectorize") set(LINKER_FLAGS "${LINKER_FLAGS} -Wl,--as-needed -Wl,--gc-sections -Wl,--no-undefined -Wl,--strip-all -Wl,-rpath-link=${ANDROID_NDK_SYSROOT}/usr/lib/ -L${ANDROID_NDK_SYSROOT}/usr/lib/") add_library(test SHARED ${TEST_SRC}) target_link_libraries(test log android) set_target_properties(test PROPERTIES COMPILE_DEFINITIONS "ANDROID") set(APP_SHARED_LIBRARIES ${LIBRARY_OUTPUT_PATH}/libtest.so) android_create_apk(test "${CMAKE_BINARY_DIR}/apk" "${APP_SHARED_LIBRARIES}" "" "Data")

这是Main.cpp。

#include <android_native_app_glue.h>
#include <android/log.h>

#define APPNAME "TestApp"

void android_main(struct android_app* state)
{
    app_dummy(); // Make sure glue isn't stripped

    __android_log_print(ANDROID_LOG_INFO, APPNAME, "HolyShit you did it !");

    ANativeActivity_finish(state->activity);
}

1
这个答案在我点赞之前已经非常完整了,但是我该如何使用TakaNoMe的脚本呢?我没有看到任何教程。有一个Cmake命令行调用的示例吗?谢谢。 - CoffeDeveloper
2
不要使用Android cmake分支,而是使用NDK附带的android.toolchain文件(需要CMake 3.6)。 - Suici Doga

6

1
请发起一个拉取请求,将此更改合并到taka-no-me的代码库中。 - Lrdx

0

android/ndk-samples

我建议查看官方的 CMake Android 示例:https://github.com/android/ndk-samples

其中包含了 C++ 示例、文档等。

Professional CMake

我还建议阅读 Craig Scott 的《Professional CMake》: https://crascit.com/professional-cmake/

其中有一章专门介绍了 Android 和 CMake,解释了很多重要信息。

Android CMake 工具链

CMake 用户需要了解的主要内容是官方的 CMake Android 工具链文件 android.toolchain.cmake

android.toolchain.cmake 位于 NDK(Native Developer Kit)中,它告诉 CMake 构建 Android 所需的全部信息。

因此,你的配置步骤将类似于:

cmake -S . -B build/ -D CMAKE_TOOLCHAIN_FILE=$ANDROID_NDK_ROOT/build/cmake/android.toolchain.cmake ...

请参阅文档以获取更多信息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接