带有OpenGLES2的Android NDK未定义的glcalls引用

时间:2015-02-20 15:39:55

标签: c++ android-ndk opengl-es-2.0

遵循以下教程:http://www.learnopengles.com/calling-opengl-from-android-using-the-ndk/ 创建了所有必需的文件,但在尝试构建时我得到错误:

  

d:\ SVN-Genicap3D \主干\ frontend_android \ Genicap3D \应用\ SRC \主\ JNI \芯\ game.cpp
  错误:(6)未明确引用' glClearColor'
  错误:(14)未定义对`glClear'

的引用

game.cpp

#include "game.h"
#include <GLES2/gl2.h>

void on_surface_created() {
    glClearColor(1.0f, 0.0f, 0.0f, 0.0f);
}

void on_surface_changed() {
    // No-op
}

void on_draw_frame() {
    glClear(GL_COLOR_BUFFER_BIT);
}

android.mk

LOCAL_PATH:=$(call my-dir)
include $(CLEAR_VARS)

# Here we give our module name and source file(s)

LOCAL_MODULE    := libgame
LOCAL_CFLAGS    := -Wall -Wextra
LOCAL_LDLIBS :=  -llog -lnativehelper -lGLESv2
LOCAL_CPP_FEATURES += exceptions
LOCAL_SHARED_LIBRARIES := liblog libnativehelper libGLESv2
LOCAL_SRC_FILES := coreBridge.cpp core/game.cpp

# To build the whole .so
FILE_LIST := $(wildcard $(LOCAL_PATH)/../../../core/src/*.cpp)
LOCAL_SRC_FILES += $(FILE_LIST:$(LOCAL_PATH)/%=%) LOCAL_C_INCLUDES += $(LOCAL_PATH)/../../../core/include


include $(BUILD_SHARED_LIBRARY)

game.cpp和.h位于核心地图中,与.mk文件位于同一地图

我试图从其他答案中包含很多但似乎没有任何答案。 随意请求更多文件。

2 个答案:

答案 0 :(得分:3)

当您使用Android Studio时,默认会忽略您的Makefile,并且会动态生成新的Makefile,因此OpenGL ES2 lib无法正确引用。

此功能是Android Studio目前支持NDK构建的方式,但它已被弃用,而更好的方法是在工作中。

您仍然可以选择使用它并在build.gradle中指定您需要链接到OpenGL ES:

android {
 ...
 defaultConfig {
        ndk {
            moduleName "game"
            ldLibs "GLESv2"               
        }
    }
}

但在我看来,现在最好的方法是停用内置的NDK支持并改为使用Makefile:

import org.apache.tools.ant.taskdefs.condition.Os

apply plugin: 'com.android.application'

    android {
        ...

        sourceSets.main {
            jniLibs.srcDir 'src/main/libs' //set .so files directory to libs
            jni.srcDirs = [] //disable automatic ndk-build call
        }

        // call regular ndk-build(.cmd) script from app directory
        task ndkBuild(type: Exec) {
            if (Os.isFamily(Os.FAMILY_WINDOWS)) {
                commandLine 'ndk-build.cmd', '-C', file('src/main').absolutePath
            } else {
                commandLine 'ndk-build', '-C', file('src/main').absolutePath
            }
        }

        tasks.withType(JavaCompile) {
            compileTask -> compileTask.dependsOn ndkBuild
        }
    }

答案 1 :(得分:1)

在Android Studio中,您可以进入CMakeLists.txt文件并添加

target_link_libraries(EGL
                      GLESv2)