хочу попробывал сделать игру для android на c++. И такое вроде возможно. Хотел бы на sdl2 делать, но та версия, которая компилируется для android а это 2.0.10 она глючная, как и глючная 2.0.9. С ними такие проблемы, что косяк на косяке. Как они вообще тестирует свой софт не понятно. В общем я решил делать в android studio в jni. Я думаю использовать GLSurfaceView и его передавать в jni, чтобы создать нативное окно, но на этом этапе происходит ошибка, сначала SIGABRT, потом SIGSEGV. Вот код java.
package com.example.gametest;
import androidx.appcompat.app.AppCompatActivity;
import android.opengl.GLSurfaceView;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
// Used to load the 'native-lib' library on application startup.
static {
System.loadLibrary("native-lib");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Example of a call to a native method
GLSurfaceView view = findViewById(R.id.glsurface);
gametest(view);
}
/**
* A native method that is implemented by the 'native-lib' native library,
* which is packaged with this application.
*/
public native void gametest(GLSurfaceView view);
}
Потом c++ код.
#include <jni.h>
#include <string>
#include <EGL/egl.h>
#include <android/native_window_jni.h>
#include <android/native_activity.h>
#include <android/rect.h>
#include <android/surface_control.h>
#include <android/window.h>
#include <GLES3/gl3.h>
#include <unistd.h>
EGLDisplay display;
EGLSurface window;
EGLBoolean initializeWindow ( EGLNativeWindowType win ) {
const EGLint configAttribs[] =
{
EGL_RENDERABLE_TYPE, EGL_WINDOW_BIT,
EGL_RED_SIZE, 8,
EGL_GREEN_SIZE, 8,
EGL_BLUE_SIZE, 8,
EGL_ALPHA_SIZE, 8,
EGL_DEPTH_SIZE, 24,
EGL_NONE
};
const EGLint contextAttribs[] =
{
EGL_CONTEXT_CLIENT_VERSION, 3,
EGL_NONE
};
display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
if ( display == EGL_NO_DISPLAY ) {
return EGL_FALSE;
}
EGLint major, minor;
if ( !eglInitialize(display, &major, &minor ) ) {
return EGL_FALSE;
}
EGLConfig config;
EGLint numConfigs;
if ( !eglChooseConfig(display, configAttribs, &config, 1, &numConfigs ) ) {
return EGL_FALSE;
}
window = eglCreateWindowSurface(display, config, win, NULL );
if ( window == EGL_NO_SURFACE ) {
return EGL_FALSE;
}
EGLContext context = eglCreateContext(display, config, EGL_NO_CONTEXT, contextAttribs );
if ( context == EGL_NO_CONTEXT ) {
return EGL_FALSE;
}
if ( !eglMakeCurrent(display, window, window, context ) ) {
return EGL_FALSE;
}
return EGL_TRUE;
}
extern "C" JNIEXPORT void JNICALL
Java_com_example_gametest_MainActivity_gametest (
JNIEnv *env,
jobject jobj,
jobject surface) {
ANativeWindow *win = ANativeWindow_fromSurface(env, surface);
EGLBoolean res = initializeWindow( win );
int32_t width = ANativeWindow_getWidth(win);
int32_t height = ANativeWindow_getHeight(win);
while ( 1 ) {
eglSwapBuffers(display, window);
usleep(1000);
}
return;
}
И вот в этой функции вроде происходит ошибка. Но мне же нужен opengl surface. Как понять что делать я не могу.
ANativeWindow *win = ANativeWindow_fromSurface(env, surface);