Следуя инструкциям на сайте: 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.
Я пытался включить много других ответов, но, похоже, ни один из них не работает. Не стесняйтесь просить больше файлов.
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
}
}
В Android Studio вы можете зайти в файл CMakeLists.txt и добавить
target_link_libraries(EGL
GLESv2)
Похожие вопросы
Новые вопросы
c++
C++ — это язык программирования общего назначения. Изначально он разрабатывался как расширение C и имел аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде, который будет скомпилирован с помощью компилятора C++. Используйте тег версии для вопросов, связанных с конкретной стандартной версией [C++11], [C++14], [C++17], [C++20] или [C++23]. и т.д.