在Android NDK中使用Eigen

6
有没有人成功地使用NDK导入eigen库?我在考虑在应用程序中使用它来执行所有的数学矩阵操作。我在一些论坛上看到有些人提到它,但除了我不知道他们是否成功使用以外,我读到的大多数论坛都是关于与NEON代码相关的错误......而我之前也没有涉及过这个。如果有人能指点我如何使用NDK编译现有库(如eigen)的教程,那就太好了。这样我以后就可以自己做了。我刚刚发现了这个网站:http://code.google.com/p/android-cmake/,并想尝试自己实现它,但不确定从哪里开始。显然,我需要进行一些繁琐的阅读,所以我会开始阅读,但同时,如果有人能帮助编译原生库以供使用NDK,我会非常感激的。

所以在玩了一下cmake之后,我还没有得到任何编译的东西,主要是因为我不知道如何使用命令行来设置变量,就像教程中所说的那样。我必须说,对于一个不是狂热命令行用户的人来说,android-cmake附带的这些教程在描述如何设置事物时真的非常模糊。作者假设你已经知道如何使用所有内容,并省略了很多细节。我在寻找有关使eigen工作的文档时也发现了这个:https://bitbucket.org/erublee/eigen-android。看起来很有前途。 - James andresakis
1
Eigen是一个头文件库,不需要编译。CMake脚本只编译测试并生成Doxygen文档。 - P3trus
嘿,感谢您的评论 :) 那么我该如何在ndk中使用Eigen呢?我只需将Eigen源代码复制到我的Android项目中某个jni文件夹中,然后在android.mk或application.mk文件中声明我正在使用的名称吗?如果是这样,那么我在mk文件中需要声明什么呢?如果您无法告诉我,那么我并不是一个命令行或GNU大师 ;) 所以我对于在MS Visual Studio或IDE之外做任何事情的知识有点有限。 - James andresakis
只需使用 -I ( -I/path/to/eigen ) 将包含目录添加到编译器即可。 - user181351
2个回答

3
我以前从未使用过Android NDK,在物理学的数值计算中使用Eigen。
Eigen是仅包含头文件的,因此您可以将其放在任何地方。您只需要将include路径设置为该文件夹(可能在Android.mk内)。如果您不需要Eigen中的不受支持的库,则只需要“Eigen”文件夹。其余部分仅用于文档和测试。 经过简短查阅文档后,我认为您可以通过以下方式实现。
LOCAL_C_INCLUDES := path/to/eigen

在您的Android.mk文件中

一个快速而简单的解决方案是把Eigen放在“jni”文件夹里。但是,只有当所有使用Eigen的源代码也在那里时,这种方法才有效。这样,您就不必编辑您的Android.mk文件。


好的,我相当确定我理解了。在我尝试之前,让我快速地向您确认一下......因此,在我的make文件中,我只需要声明要将eigen库文件包含在我的构建中?我知道我必须#include我打算使用的任何头文件,但我不确定如何确保实际的eigen源文件出现在我的项目中,以便我可以使用它们。我不介意你提到的“快速而肮脏”的方法,因为整个eigen库大约只有1.8 MB,所以我可以剪切掉我不需要的任何内容,如测试等。 - James andresakis
1
当你的代码中有一个 #include <whatever> 时,预处理器会搜索这个文件并将其内容粘贴到你的代码中。预处理器在本地文件夹和其搜索路径中的每个文件夹中寻找该文件。你无需在 makefile 中指定 Eigen 文件,因为它们不会被编译。你只需要确保预处理器能够找到它们即可。 - P3trus
非常感谢 :) 你的建议真的帮我搞清楚了该怎么做才能让事情正常运转。当我把它组合起来并看到它工作时,我会回复并告诉你我是如何在我的应用程序中使其全部运行的 :) - James andresakis
所以,最终我通过直接将Eigen文件导入我的jni文件夹中,让ndk注意到了库。这并不是我想要采取的方式,但它绝对有效。现在,我只需要清理一下我奇怪的C++代码,就可以搞定了 :) - James andresakis

1

我更喜欢将Eigen头文件放在Eclipse工作区之外,就像stl等一样。为此,请解压缩您的Eigen下载并将文件夹“Eigen”复制到您选择的目录中:

/Users/foo/libraries/eigen/Eigen

然后,在项目的Android.mk文件中,告诉ndk-build Eigen包含文件的位置:

LOCAL_C_INCLUDES += /Users/foo/libraries/eigen

不要在此处引用实际的“Eigen”文件夹,而是引用其上面的文件夹,否则包含文件将无法正常工作。最后,告诉eclipse索引器有关这些包含文件:

右键单击您的项目 -> 属性 -> C/C++通用 -> 路径和符号 -> 包含 -> GNU C++ -> 添加... -> 文件系统... -> 再次将其指向 /Users/foo/libraries/eigen

完成。


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