consider template example

56 views
Skip to first unread message

J SG

unread,
Mar 21, 2022, 11:36:39 AM3/21/22
to android-ndk
to develop for PC I use wxDev c++. Is outdated and still has bugs, and things like threads are considered 'experimental' in the latest version released, probably about a decade ago or even more than that.

Still, is enough for what I do, and the IDE is not cluttered with things I don't care about or it does not block me because of things is doing in the background, and is clear what is happening all the time, plus the things I need are there. It does not stuff the window with things just to say they have those things even if they just get on the way.

But mostly I do not deal with Windows forms (for that I use C#). the things I do with c++ are mostly multimedia things, and there is a template I can load by simply selecting the option. When I select that template this is what appears on the project:

/**************************
 * Includes
 *
 **************************/

#include <windows.h>
#include <gl/gl.h>


/**************************
 * Function Declarations
 *
 **************************/

LRESULT CALLBACK WndProc (HWND hWnd, UINT message,
WPARAM wParam, LPARAM lParam);
void EnableOpenGL (HWND hWnd, HDC *hDC, HGLRC *hRC);
void DisableOpenGL (HWND hWnd, HDC hDC, HGLRC hRC);


/**************************
 * WinMain
 *
 **************************/

int WINAPI WinMain (HINSTANCE hInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR lpCmdLine,
                    int iCmdShow)
{
    WNDCLASS wc;
    HWND hWnd;
    HDC hDC;
    HGLRC hRC;        
    MSG msg;
    BOOL bQuit = FALSE;
    float theta = 0.0f;

    /* register window class */
    wc.style = CS_OWNDC;
    wc.lpfnWndProc = WndProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInstance;
    wc.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wc.hCursor = LoadCursor (NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH) GetStockObject (BLACK_BRUSH);
    wc.lpszMenuName = NULL;
    wc.lpszClassName = "GLSample";
    RegisterClass (&wc);

    /* create main window */
    hWnd = CreateWindow (
      "GLSample", "OpenGL Sample",
      WS_CAPTION | WS_POPUPWINDOW | WS_VISIBLE,
      0, 0, 256, 256,
      NULL, NULL, hInstance, NULL);

    /* enable OpenGL for the window */
    EnableOpenGL (hWnd, &hDC, &hRC);

    /* program main loop */
    while (!bQuit)
    {
        /* check for messages */
        if (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE))
        {
            /* handle or dispatch messages */
            if (msg.message == WM_QUIT)
            {
                bQuit = TRUE;
            }
            else
            {
                TranslateMessage (&msg);
                DispatchMessage (&msg);
            }
        }
        else
        {
            /* OpenGL animation code goes here */

            glClearColor (0.0f, 0.0f, 0.0f, 0.0f);
            glClear (GL_COLOR_BUFFER_BIT);

            glPushMatrix ();
            glRotatef (theta, 0.0f, 0.0f, 1.0f);
            glBegin (GL_TRIANGLES);
            glColor3f (1.0f, 0.0f, 0.0f);   glVertex2f (0.0f, 1.0f);
            glColor3f (0.0f, 1.0f, 0.0f);   glVertex2f (0.87f, -0.5f);
            glColor3f (0.0f, 0.0f, 1.0f);   glVertex2f (-0.87f, -0.5f);
            glEnd ();
            glPopMatrix ();

            SwapBuffers (hDC);

            theta += 1.0f;
            Sleep (1);
        }
    }

    /* shutdown OpenGL */
    DisableOpenGL (hWnd, hDC, hRC);

    /* destroy the window explicitly */
    DestroyWindow (hWnd);

    return msg.wParam;
}


/********************
 * Window Procedure
 *
 ********************/

LRESULT CALLBACK WndProc (HWND hWnd, UINT message,
                          WPARAM wParam, LPARAM lParam)
{

    switch (message)
    {
    case WM_CREATE:
        return 0;
    case WM_CLOSE:
        PostQuitMessage (0);
        return 0;

    case WM_DESTROY:
        return 0;

    case WM_KEYDOWN:
        switch (wParam)
        {
        case VK_ESCAPE:
            PostQuitMessage(0);
            return 0;
        }
        return 0;

    default:
        return DefWindowProc (hWnd, message, wParam, lParam);
    }
}


/*******************
 * Enable OpenGL
 *
 *******************/

void EnableOpenGL (HWND hWnd, HDC *hDC, HGLRC *hRC)
{
    PIXELFORMATDESCRIPTOR pfd;
    int iFormat;

    /* get the device context (DC) */
    *hDC = GetDC (hWnd);

    /* set the pixel format for the DC */
    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 = 24;
    pfd.cDepthBits = 16;
    pfd.iLayerType = PFD_MAIN_PLANE;
    iFormat = ChoosePixelFormat (*hDC, &pfd);
    SetPixelFormat (*hDC, iFormat, &pfd);

    /* create and enable the render context (RC) */
    *hRC = wglCreateContext( *hDC );
    wglMakeCurrent( *hDC, *hRC );

}


/******************
 * Disable OpenGL
 *
 ******************/

void DisableOpenGL (HWND hWnd, HDC hDC, HGLRC hRC)
{
    wglMakeCurrent (NULL, NULL);
    wglDeleteContext (hRC);
    ReleaseDC (hWnd, hDC);
}

--------------------------------------------------------

And that is all there is; is basically the same stuff that goes in most if not all 'native activity glue' projects; except there is no template for native activity glue in NDK or even an example so far as I am aware of that can be simply downloaded and copied as the basis for a new project in NDK.

The examples given for native activity using opengl like San Angeles which were made for IDEs that are no longer used since 10 years ago can not be simply downloaded and run without having to modify them, and of course knowing how to modify them.

In contrast, the template from wxDev has the basics, or the chassis that goes in every multimedia or most programs. There is simply the loop that goes through the events queue and the idle or step function, and a switch that selects the type of event, besides of the required initialization and ending. The function does not have anything fancy so I just have to delete between 5 or 10 lines to use it on my own projects and is clear which lines do I have to delete; there is no guessing on what does it do, and serves as an example of which events can happen and how to handle them. Once I delete between 5 to 10 lines I can simply fill the required spaces with my own code and I am done

But there is no such thing that I am aware of for NDK, even though the people who made the NDK and decided the name of the functions, the parameters for each one and so on, could make in less than a week an example that can be copied as the basis for a new project, that has simply the basics without clutter but also giving an example on how to deal with different events like rotation and resize and screen touches

Please consider releasing an example that can be used as a template for native activity glue projects and can be simply downloaded and compiled and executed in the current IDE without having to go through guessing on how to use it or modify it

enh

unread,
Mar 21, 2022, 12:03:53 PM3/21/22
to android-ndk
this isn't true. if you go into Android Studio's "new project" wizard, one of the options is to start from one of the demo projects.
 
In contrast, the template from wxDev has the basics, or the chassis that goes in every multimedia or most programs. There is simply the loop that goes through the events queue and the idle or step function, and a switch that selects the type of event, besides of the required initialization and ending. The function does not have anything fancy so I just have to delete between 5 or 10 lines to use it on my own projects and is clear which lines do I have to delete; there is no guessing on what does it do, and serves as an example of which events can happen and how to handle them. Once I delete between 5 to 10 lines I can simply fill the required spaces with my own code and I am done

But there is no such thing that I am aware of for NDK, even though the people who made the NDK and decided the name of the functions, the parameters for each one and so on, could make in less than a week an example that can be copied as the basis for a new project, that has simply the basics without clutter but also giving an example on how to deal with different events like rotation and resize and screen touches

Please consider releasing an example that can be used as a template for native activity glue projects and can be simply downloaded and compiled and executed in the current IDE without having to go through guessing on how to use it or modify it

--
You received this message because you are subscribed to the Google Groups "android-ndk" group.
To unsubscribe from this group and stop receiving emails from it, send an email to android-ndk...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/android-ndk/c601fbe4-53cb-4eec-90d4-09ec920e37c6n%40googlegroups.com.
Reply all
Reply to author
Forward
0 new messages