Следуя инструкциям на сайте: http://www.learnopengles.com /calling-opengl-from-android-with-ndk/.
Создал все необходимые файлы, но при попытке сборки получаю ошибки:

D:\svn-Genicap3D\trunk\frontend_android\Genicap3D\app\src\main\jni\core\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.

Я пытался включить много других ответов, но, похоже, ни один из них не работает. Не стесняйтесь просить больше файлов.

0
BramGoderie 20 Фев 2015 в 18:39
Как вы строили свой проект? Вы пытались собрать пример hello-gl2 NDK?
 – 
Kazuki Sakamoto
20 Фев 2015 в 21:00
В настоящее время я пытаюсь использовать Android-студию в качестве IDE. Кажется, я не могу запустить этот образец ни как проект, ни как импортированный модуль в пустом проекте.
 – 
BramGoderie
23 Фев 2015 в 11:48

2 ответа

Поскольку вы используете Android Studio, ваши файлы Makefile по умолчанию игнорируются, а новые генерируются на лету, поэтому на библиотеку OpenGL ES2 не ссылаются должным образом.

Эта функция заключается в том, как сборки NDK в настоящее время поддерживаются в Android Studio, но она устарела, в то время как лучший способ сделать это находится в разработке.

Вы все еще можете использовать его и указать внутри вашего build.gradle, что вам нужно связать с OpenGL ES:

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

Но лучше всего на данный момент, на мой взгляд, деактивировать встроенную поддержку NDK и вместо этого использовать ваши Makefiles:

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
        }
    }
3
ph0b 23 Фев 2015 в 12:03
Кажется, проблема решена, но я полагаю, теперь ndk должен быть в src/main? Вместо одного фиксированного места
 – 
BramGoderie
23 Фев 2015 в 12:26
Ваши исходники ndk должны находиться в src/main/jni, как определено в файле build.gradle, но вы можете выбрать другое место, если хотите, и соответствующим образом изменить конфигурацию.
 – 
ph0b
23 Фев 2015 в 12:34
Кажется, я не могу заставить его работать, с вашим последним вариантом я получаю «ndk-build.cmd», не распознанный, за которым следует команда ndk-build.cmd, завершенная с ненулевым выходным значением 1. И если я использую ваш первый вариант я получаю "GLESv2" не найден
 – 
BramGoderie
23 Фев 2015 в 14:01
Если ndk-build.cmd не найден, вам следует добавить путь к вашему ndk в путь к вашей среде. Это странно для GLESv2. Можете ли вы дать точное сообщение об ошибке?
 – 
ph0b
23 Фев 2015 в 14:06
Я скопировал всю папку ndk (из загрузки) в src/main/jni, файл ndk-build.cmd в нем есть, но все равно не распознается (расположение: src/main/jni/ndk-build. команда). После того, как вы поместили туда всю папку, ошибка из «GLESv2» изменилась: Ошибка: не удалось выполнить задачу «: app: compileDebugNdk». Код ошибки: 255 Вывод: «C:\Users\bram\AppData\Local\Android\ndk\prebuilt/windows-x86_64/bin/make.exe»: прерывание/исключение поймано (код = 0xc00000fd, адрес = 0000000000420386)
 – 
BramGoderie
23 Фев 2015 в 14:21

В Android Studio вы можете зайти в файл CMakeLists.txt и добавить

target_link_libraries(EGL
                      GLESv2)
2
ek360 17 Авг 2017 в 12:02