将Eigen库添加到Android NDK

8
我需要在我的Android Studio项目中包含Eigen库,以执行一些线性代数运算并使用我为桌面开发的一些C++代码。我已经在这个主题上寻找了一些信息,但是并没有太多,而且我对Android NDK很陌生。Eigen库不需要编译,所以我认为这会很容易,但是我似乎缺少了一些东西。我尝试将Eigen文件夹(其中包含所有包含文件)复制到NDK文件夹(..\Android\Sdk\ndk-bundle\sysroot\usr\include)中,其中还有其他外部库(例如GLES),但是Android Studio无法检测到它。我该怎么办??非常感谢您的帮助,我真的需要这个。
编辑1: 如您所见,Eigen库已被包含,但是当我编译项目时出现了许多错误,我不知道为什么。有任何想法吗?

请查看此链接和此链接:https://developer.android.com/studio/projects/gradle-external-native-builds.html,https://developer.android.com/studio/projects/add-native-code.html - Jon Goodwin
非常感谢。我在我的CMakeLists.txt文件中添加了这一行include_directories(src/main/cpp/Eigen/)Now,现在Visual Studio可以“看到”Eigen的包含文件了,但是项目无法编译(请参见编辑部分)。 - edusan1213
如果您想要作为输出的本地库(多个版本的.so文件),则需要编译头文件(即使它们是.h头文件,其中包含需要编译的活动C++代码,就像您有.cpp文件一样)。您会遇到诸如未声明标识符Matrix之类的问题,因此编译器无法看到Matrix的定义,例如。 - Jon Goodwin
我的应用程序界面使用Java,但是我使用C++进行数据处理(使用机器学习算法进行昂贵的数学操作),并通过JNI将处理后的数据返回给Java端,以提高性能。为了实现这些算法,我使用了这个库,它是用C++编写的,可以非常简化线性代数运算。因此,我的计划是在Android NDK中包含这个库的头文件,并在C++中使用它。 - edusan1213
那个链接可能非常有用,我之前没有看到过!我会仔细阅读它,谢谢! - edusan1213
显示剩余5条评论
2个回答

8

最终我达成了目标,在Android中使用Eigen。如果你正在尝试在Android中使用Eigen库,希望这篇文章能对你有所帮助:

  1. 从官方网站下载Eigen库。
  2. 将你下载的zip文件中包含所有头文件(.h文件)的Eigen文件夹复制到你选择的项目文件夹中。例如,我将其放在了:

    ../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库的头文件即可。


我从https://eigen.tuxfamily.org下载了Eigen源文件。我将eigen文件夹放在与CMakeLists.txt文件相同的文件夹中,并在CMakeLists.txt文件中添加include_directories(eigen)。 - 劉大為

0
  1. https://github.com/eigenteam/eigen-git-mirror克隆Eigen git存储库,例如到ThirdParty / eigen

  2. 将Eigen简单地添加到构建过程中,例如添加到您的根CMakeLists.txt

    add_subdirectory(ThirdParty/eigen)

  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


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