@xverizex

Как сделать чтобы заработал opengl через jni в android?

хочу попробывал сделать игру для 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);
  • Вопрос задан
  • 560 просмотров
Пригласить эксперта
Ответы на вопрос 1
jamakasi666
@jamakasi666 Куратор тега Java
Просто IT'шник.
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы