CMake 与 Android NDK:find_library

分享于2022年07月17日 android-ndk c++ cmake 问答
【问题标题】:CMake 与 Android NDK:find_library() 调用找不到任何东西(CMake with Android NDK: find_library() calls don't find anything)
【发布时间】:2022-07-15 06:43:00
【问题描述】:

我正在尝试使用 CMake 设置一个类似于 hello-world 的项目并集成 Android NDK。我找到了很有前途的文档,尤其是关于 CMake 的内置 Android NDK 支持的文档。

但是,我面临一些问题。

首先, find_library() 没有找到任何东西。我正在打电话 find_library(mediandk-lib mediandk) 来查找mediandk 并将其保存到 mediandk-lib ,但是在打印变量的内容时它只报告 mediandk-lib-NOTFOUND

其次,在包含路径方面的最佳做法是什么?我知道 find_library() 不完全是 find_package() 。我不太确定这些差异,但如果我没记错的话,它不会自动设置包含路径。那么我是否必须手动执行此操作,指向安装 NDK 的正确文件夹,或者如何很好地完成?

这是我的 CMakeLists.txt 的样子:

cmake_minimum_required(VERSION 3.23)
project(playground)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

set(CMAKE_SYSTEM_NAME Android)
set(CMAKE_SYSTEM_VERSION 21)
set(CMAKE_ANDROID_NDK $ENV{ANDROID_NDK_HOME})
#export ANDROID_NDK_HOME=/Users/john/Library/Android/sdk/ndk/21.1.6352462
set(CMAKE_ANDROID_NDK_TOOLCHAIN_VERSION "clang")
set(CMAKE_ANDROID_STL_TYPE "c++_static")
set(CMAKE_ANDROID_ARCH_ABI "arm64-v8a")

add_executable(playground
    src/main.cpp
)

target_link_libraries(playground
    mediandk #I should instead use find_library and link against mediandk-lib
)

这是我的 main.cpp

#include 

#include 

auto main() -> int
{
    std::cout << "playground\n";
    auto* codec = AMediaCodec_createDecoderByType("audio/mpeg");
    AMediaCodec_delete(codec);
    std::cout << "done\n";

    return 0;
}

是的:

  • 如何使 find_library() 正常工作?
  • 如何处理包含目录?
  • 进行此设置的最佳做法或黄金标准是什么?


【解决方案1】:

这是 NDK 中的测试,表明这是有效的: https://cs.android.com/android/platform/superproject/+/master-ndk:ndk/tests/build/cmake-find_library/CMakeLists.txt

使用 the toolchain file ,您的问题可能会消失。我们已经尝试与 cmake 合作,以使这变得不必要,但坦率地说,它一直是错误的来源,并且 afaict 用户根本不会从避免使用工具链文件中受益。

FWIW,像你一样使用 mediandk 绝对没有错。 find_library 在这里太过分了。