Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否可以混合使用C++;使用LWJGL的Java OpenGL代码?_Java_C++_Windows_Opengl_Lwjgl - Fatal编程技术网

是否可以混合使用C++;使用LWJGL的Java OpenGL代码?

是否可以混合使用C++;使用LWJGL的Java OpenGL代码?,java,c++,windows,opengl,lwjgl,Java,C++,Windows,Opengl,Lwjgl,我想做一个Java应用程序。使用CEF3库。 CEF是在任何应用程序中嵌入Google Chrome浏览器的库。 LWJGL用于用Java编写GL代码。 但是在使用CEF之前,基本的问题是如何混合C++和java。 > java主调用C++部分作为DLL C++部件创建窗口并设置GL上下文 在消息循环中,C++调用java部分再次调用GL 用Java工作 以下测试代码失败,并显示消息: 本机方法中的致命错误:线程[main,5,main]:未创建上下文 当前或在当前上下文中不可用的函数被删除

我想做一个Java应用程序。使用CEF3库。 CEF是在任何应用程序中嵌入Google Chrome浏览器的库。 LWJGL用于用Java编写GL代码。 但是在使用CEF之前,基本的问题是如何混合C++和java。 <> > java主调用C++部分作为DLL

  • C++部件创建窗口并设置GL上下文

  • 在消息循环中,C++调用java部分再次调用GL 用Java工作

    以下测试代码失败,并显示消息:

    本机方法中的致命错误:线程[main,5,main]:未创建上下文 当前或在当前上下文中不可用的函数被删除 打电话。JVM将中止执行。
    在org.lwjgl.opengl.GL11.glColor3f(本机方法)
    在Main.run(Main.java:18)
    at Main.cppmain(本机方法)
    Main.Main(Main.java:10)

    可能是因为Java部分不知道 关于C++部分创建的GL上下文。 我的问题是如何设置GL上下文 所以C++和java都可以调用GL函数?
    Main.java

    import org.lwjgl.opengl.GL11;
    
    public class Main implements Runnable {
        {
            System.loadLibrary("cppgl");
        }
    
        public static void main(String[] args) {
            Main me = new Main();
            me.cppmain(me);
        }
    
        private native void cppmain(Runnable callback);
    
        @Override
        public void run() {
            // callback from cpp
            GL11.glColor3f(1.0f, 0.0f, 1.0f);
        }
    }
    

    cppgl.cpp

    #pragma comment(lib, "OpenGL32.lib")
    
    #include <windows.h>
    #include <tchar.h>
    #include <functional>
    #include <gl/gl.h>
    #include <jni.h>
    #pragma comment(lib, "jvm.lib")
    
    LRESULT CALLBACK WndProc(HWND hWnd, UINT mes, WPARAM wParam, LPARAM lParam) {
        if (mes == WM_DESTROY || mes == WM_CLOSE) { PostQuitMessage(0); return 0; }
        return DefWindowProc(hWnd, mes, wParam, lParam);
    }
    
    extern "C" JNIEXPORT void JNICALL Java_Main_cppmain
    (JNIEnv *env, jobject, jobject callback) {
    
        LPCTSTR title = L"gl test";
    
        // prepare JNI call
        jclass cls = env->FindClass("Ljava/lang/Runnable;");
        jmethodID mid = env->GetMethodID(cls, "run", "()V");
    
        // window class
        HINSTANCE hInstance = ::GetModuleHandle(NULL);
        WNDCLASSEX wcex;
        ZeroMemory(&wcex, sizeof(wcex));
        wcex.cbSize = sizeof(wcex);
        wcex.style = CS_OWNDC | CS_HREDRAW | CS_VREDRAW;
        wcex.lpfnWndProc = WndProc;
        wcex.hInstance = hInstance;
        wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
        wcex.lpszClassName = title;
        if (!RegisterClassEx(&wcex)) return;
    
        // window
        RECT R = { 0, 0, 640, 480 };
        AdjustWindowRect(&R, WS_OVERLAPPEDWINDOW, FALSE);
        HWND hWnd = CreateWindow(title, title, WS_OVERLAPPEDWINDOW,
            CW_USEDEFAULT, 0, R.right - R.left, R.bottom - R.top,
            NULL, NULL, hInstance, NULL);
        if (!hWnd) return;
    
        // GL context
        PIXELFORMATDESCRIPTOR pfd;
        ZeroMemory(&pfd, sizeof(pfd));
        pfd.nSize = sizeof(pfd);
        pfd.nVersion = 1;
        pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
        pfd.iPixelType = PFD_TYPE_RGBA;
        pfd.cColorBits = 32;
        pfd.cDepthBits = 24;
        pfd.iLayerType = PFD_MAIN_PLANE;
        HDC dc = GetDC(hWnd);
        int format = ChoosePixelFormat(dc, &pfd);
        SetPixelFormat(dc, format, &pfd);
        HGLRC glRC = wglCreateContext(dc);
        if (!wglMakeCurrent(dc, glRC)) return;
    
        // message loop
        ShowWindow(hWnd, SW_SHOW);
        MSG msg;
        do {
            if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
            }
            else {
                wglMakeCurrent(dc, glRC);
                glClearColor(0.0f, 0.5f, 1.0f, 1.0f);
    
                // call Java and change clear color here
                env->CallVoidMethod(callback, mid);
    
                glClear(GL_COLOR_BUFFER_BIT);
                glRectf(-0.5f, -0.5f, 0.5f, 0.5f);
                glFlush();
                SwapBuffers(dc);
                wglMakeCurrent(NULL, NULL);
            }
        } while (msg.message != WM_QUIT);
    
        // clean up
        wglMakeCurrent(NULL, NULL);
        wglDeleteContext(glRC);
        ReleaseDC(hWnd, dc);
    }
    
    #pragma注释(lib,“OpenGL32.lib”)
    #包括
    #包括
    #包括
    #包括
    #包括
    #pragma注释(lib,“jvm.lib”)
    LRESULT回调WndProc(HWND HWND、UINT mes、WPARAM WPARAM、LPARAM LPARAM){
    如果(mes==WM|u DESTROY | mes==WM|u CLOSE){PostQuitMessage(0);返回0;}
    返回DefWindowProc(hWnd、mes、wParam、lParam);
    }
    外部“C”JNIEXPORT void JNICALL Java\u Main\u cppmain
    (JNIEnv*env、jobject、jobject回调){
    LPCTSTR标题=L“gl测试”;
    //准备JNI呼叫
    jclass cls=env->FindClass(“Ljava/lang/Runnable;”);
    jmethodID mid=env->GetMethodID(cls,“run”和“()V”);
    //窗口类
    HINSTANCE HINSTANCE=::GetModuleHandle(NULL);
    WNDCLASSEX wcex;
    零内存(&wcex,sizeof(wcex));
    wcex.cbSize=sizeof(wcex);
    wcex.style=CS_OWNDC | CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc=WndProc;
    wcex.hInstance=hInstance;
    wcex.hbrBackground=(HBRUSH)(彩色窗口+1);
    wcex.lpszClassName=标题;
    如果(!RegisterClassEx(&wcex))返回;
    //窗口
    RECT R={0,060480};
    AdjustWindowRect(&R,WS_OVERLAPPEDWINDOW,FALSE);
    HWND HWND=CreateWindow(标题,标题,WS_重叠窗口,
    CW_使用默认值,0,右-左,右下-右上,
    NULL,NULL,hInstance,NULL);
    如果(!hWnd)返回;
    //GL上下文
    像素描述符pfd;
    零内存(&pfd,sizeof(pfd));
    pfd.nSize=sizeof(pfd);
    pfd.inversion=1;
    pfd.dwFlags=pfd_DRAW_TO_WINDOW | pfd_SUPPORT | OPENGL | pfd_DOUBLEBUFFER;
    pfd.iPixelType=pfd_TYPE_RGBA;
    pfd.cColorBits=32;
    pfd.cDepthBits=24;
    pfd.iLayerType=pfd_主平面;
    HDC dc=GetDC(hWnd);
    int format=ChoosePixelFormat(dc和pfd);
    SetPixelFormat(dc、format和pfd);
    HGLRC glRC=wglCreateContext(dc);
    如果(!wglMakeCurrent(dc,glRC))返回;
    //消息循环
    展示窗口(hWnd、SW_展示);
    味精;
    做{
    if(peek消息(&msg,NULL,0,0,PM_-REMOVE)){
    翻译信息(&msg);
    发送消息(&msg);
    }
    否则{
    wglMakeCurrent(dc,glRC);
    glClearColor(0.0f、0.5f、1.0f、1.0f);
    //调用Java并在此处更改“清除颜色”
    env->CallVoidMethod(回调,mid);
    glClear(GLU颜色缓冲位);
    glRectf(-0.5f,-0.5f,0.5f,0.5f);
    glFlush();
    SwapBuffers(dc);
    wglMakeCurrent(NULL,NULL);
    }
    }while(msg.message!=WM_QUIT);
    //清理
    wglMakeCurrent(NULL,NULL);
    wglDeleteContext(glRC);
    释放dc(hWnd,dc);
    }
    


    在从java进行任何渲染之前,应该在开始时调用此函数一次

        // This line is critical for LWJGL's interoperation with GLFW's
        // OpenGL context, or any context that is managed externally.
        // LWJGL detects the context that is current in the current thread,
        // creates the GLCapabilities instance and makes the OpenGL
        // bindings available for use.
        GL.createCapabilities();
    

    @AkihiroYoshikawa不,你不应该编辑问题,但是你应该接受答案(答案左边的复选标记)。注意,其他人应该能够理解问题中的问题,并阅读答案中的解决方案。