【问题标题】:Add Eigen Library to Android NDK将特征库添加到 Android NDK
【发布时间】:2025-11-29 10:05:01
【问题描述】:

我需要在我的 Android Studio 项目中包含 Eigen 库来执行一些线性代数运算并使用我为桌面开发的一些 C++ 代码。我一直在寻找有关此主题的信息,但没有太多信息,而且我是 Android NDK 的新手。本征库不需要编译,所以我认为这很容易,但我错过了一些东西。我尝试将 Eigen 文件夹(包含所有包含)复制到 NDK 文件夹(..\Android\Sdk\ndk-bundle\sysroot\usr\include)中,其中还有其他外部库(例如 GLES)但是Android Studio 没有检测到它。我该怎么做??提前谢谢你,我真的需要这个。

编辑 1: As you can see here, Eigen lib is included, but when I compile the project there are many errors, and I don't know why. Any ideas?

【问题讨论】:

  • thisthis
  • 非常感谢。我将这一行 include_directories(src/main/cpp/Eigen/)Now 添加到了我的 CMakeLists.txt 中,现在 Visual Studio “看到”了 Eigen 包含文件,但项目没有编译(参见编辑)。
  • 编译器无法“看到”您的头文件,这意味着它正在尝试编译您的 c++ 源代码。 (我认为您需要从源代码编译,因为您需要多个版本的 armeabi、armeabi-v7a、arm64-v8a 等......用于多个可能的处理器)
  • 但是Eigen不需要编译,是一个只有头文件的库,或者这就是我的想法。如何在 Android 中编译它?
  • 如果您想要一个本地库作为输出(.so 文件的多个版本),您需要编译头文件(即使它们是 .h 头文件,它们也有需要编译的活动 c++ 代码,就像你有 .cpp 文件一样)。你得到的东西像未声明的标识符矩阵,所以编译器看不到矩阵的定义。

标签: android c++ android-ndk eigen


【解决方案1】:

我终于达到了我的目标,我正在使用 Android 中的 Eigen。如果您正在尝试在 Android 中使用 Eigen 库,希望对您有所帮助:

  1. 从官方网站下载特征库。
  2. 在你下载的zip里面复制Eigen文件夹 库的标头(.h 文件)并将其粘贴到您选择的一个文件夹中 在项目中。例如,我是这样做的:

    ../app/src/main/cpp

  3. 编辑 CMakeLists.txt,将这一行与 Eigen 文件夹的路径一起添加 在您的项目中: include_directories(src/main/cpp/Eigen)
  4. 在真实设备中启动应用程序(不在模拟器上运行)以加载 Eigen 头文件。
  5. 在您的 cpp 文件中包含 Eigen 标头并正常使用它们。例如:

    #include "Eigen/Dense" void multiply2Matrices(){ Eigen::MatrixXd M(2,2); Eigen::MatrixXd V(2,2); for (int i = 0; i<=1; i++){ for (int j = 0; j<=1; j++){ M(i,j) = 1; V(i,j) = 2; } } Eigen::MatrixXd Result = M*V; }

就我而言,我不需要编译任何东西,只需使用官方 Eigen 库的头文件即可

【讨论】:

    【解决方案2】:
    1. https://github.com/eigenteam/eigen-git-mirror 克隆 Eigen git repo,例如到第三方/eigen

    2. 只需将 Eigen 添加到构建过程中,例如到你的根 CMakeLists.txt

      add_subdirectory(第三方/特征)

    3. 并使用它:

      add_library(${PROJECT_NAME} SHARED src/test_eigen.cpp)

      target_link_libraries(${PROJECT_NAME} Eigen3::Eigen)

    因此,Android NDK 的使用没有什么特别之处,只需在原生构建中包含 Eigen 内容即可。 在我的测试过程中发生的一些问题是我不得不关闭一些 Eigen 的东西,例如 ThirdParty/eigen/CMakeLists.txt 中的 doc 目标编译,因为它与我的项目中已经存在的目标相矛盾:

    if(NOT ANDROID)
        add_subdirectory(doc EXCLUDE_FROM_ALL)
    endif()
    

    完整的示例用法可以在这里找到:https://github.com/nkh-lab/ndk-eigen-hello-world

    【讨论】: