【问题标题】:How to use GLM in Android NDK Application如何在 Android NDK 应用程序中使用 GLM
【发布时间】:2013-05-27 10:03:36
【问题描述】:

我目前正在尝试将我的 OpenGL 应用程序移植到 Android,但我一直在纠结如何正确导入和构建 GLM http://glm.g-truc.net/。我在标准 C++ 应用程序中使用 GLM 没有任何问题,但是我对 NDK 还是很陌生。我已经尝试过在网上发布的所有其他解决方案,但都没有运气。这是我目前所拥有的:

我使用的是最新版本的 GLM (0.9.4)

我的 .cpp 文件包含:

    #include <glm\glm.hpp>

我的 Android.mk 文件如下所示:

    LOCAL_PATH:= $(call my-dir)

    include $(CLEAR_VARS)

    LOCAL_MODULE    := libgl2jni
    LOCAL_CFLAGS    := -Werror
    LOCAL_SRC_FILES := gl_code.cpp
    LOCAL_LDLIBS    := -llog -lGLESv2

    APP_STL := gnustl_static
    LOCAL_C_INCLUDES += \Development\OpenGL\glm-0.9.4.0\

    include $(BUILD_SHARED_LIBRARY)

**\Development\OpenGL\glm-0.4.0** 是我 C 盘上 GLM 文件的位置

在构建时,我收到此错误:

   In file included from jni/gl_code.cpp:28:0,
       \Development\OpenGL\glm-0.94.0\glm\glm.hpp:86:18: fatal error: limits: No such file or directory

这类似于 codemonkey 的问题 https://gamedev.stackexchange.com/questions/47128/android-ndk-build-cant-find-glm-headers,其中建议使用 'APP_STL := gnustl_static'。

看来我的源文件设置正确,但是存在某种我无法识别的编译器问题。非常感谢任何帮助!

【问题讨论】:

  • 我在其他地方读到,将 APP_STL := gnustl_static 放入 Application.mk(不是 Android.mk)会起作用.. 果然对我有用。

标签: android opengl-es android-ndk glm-math


【解决方案1】:

如果您使用的是 Android Studio,请遵循此解决方案。

首先,下载OpenGL数学库here

其次,解压文件夹“../glm/glm”并将其复制到您的项目位置“../app/src/main/cpp”

第三,在 CMakeList.txt 上,添加以下内容:

# Import the CMakeLists.txt for the glm library
add_subdirectory(glm) # if your CMakeLists is at '../cpp'
# add_subdirectory(src/main/cpp/glm) # if your CMakeLists is at '../app'

# add lib dependencies
target_link_libraries(
# Specifies the target library.
native-lib
# Links the target library to the log library included in the NDK.
GLESv2
glm)

第四,在“build.gradle”(模块应用程序)上,确保您有正确的 CMakeList 路径

 externalNativeBuild {
        cmake {
            path "src/main/cpp/CMakeLists.txt"
        }
 }

第五,在源文件中包含 glm 标头:

// open GL libs
#include <GLES2/gl2.h>
#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <glm/gtc/type_ptr.hpp>
#include <glm/gtx/rotate_vector.hpp>
#include <glm/gtx/closest_point.hpp>

android-ndk 上提供了示例,请参阅Android Endless Tunnel Game

【讨论】:

    【解决方案2】:

    Sam Hocevar 对 codemonkeys 问题的回答是正确的。这不是 glm 的问题。这是 glm 使用的“限制”头文件的问题。

    如果 Sam 的回答没有解决您的问题,请尝试通过将以下内容添加到您的 Application.mk 文件来将工具链更改为早期版本:

    NDK_TOOLCHAIN_VERSION=4.4.3
    

    并确保在 Eclipse 中为您的项目包含的 STL 与工具链相对应。 转到项目->属性->C/C++ 常规->路径和符号

    确保包含以下目录:

    EDIT :这些只是示例;确保您使用正确的平台和 abi

    /Path/To/NDK/sources/platforms/android-9/arch-arm/usr/include
    /Path/To/NDK/sources/cxx-stl/gnu-libstdc++/4.4.3/include
    /Path/To/NDK/sources/cxx-stl/gnu-libstdc++/4.4.3/libs/armeabi-v7a/include
    

    编辑:删除第一个目录的备注;似乎 glm 寻找当前 stl 实现提供的限制文件

    【讨论】:

    • 感谢@Erik 的快速回复。正确添加 CDT 支持(我缺少)后,我添加了您建议的所有包含。我还确保我的目标平台在任何地方都是一致的。仍然没有运气 - 同样的错误!有什么想法吗?
    • 我建议你确保你的stl路径是正确的;从我所见,glm 会查找当前活动的 stl 实现提供的限制文件。
    • 事实证明我没有给予足够的关注。我将这一切都添加到 Android.mk 中,而应该按照您和 Sam 的建议将其添加到 Application.mk 中。现在效果很好!谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-09
    • 1970-01-01
    • 2011-09-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多