0

私はNDKを使用してAndroid用の純粋なC++アプリケーションを書いています。OpenGLで2D描画を行う簡単なアプリを作成しようとしているので、テクスチャなどはありません。

ここに投稿されたすべての推奨事項を適用しましたが、まだ

実装されていないOpenGLESAPIと呼ばれます

logcatのメッセージ

これが私のマニフェストファイルです:

<?xml version="1.0" encoding="utf-8"?>
<!-- BEGIN_INCLUDE(manifest) -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.native_activity"
        android:versionCode="1"
        android:versionName="1.0">

    <uses-feature android:glEsVersion="0x00020000"></uses-feature>
    <!-- This is the platform API where NativeActivity was introduced. -->
    <uses-sdk android:minSdkVersion="9" />
    <!-- This .apk has no Java code itself, so set hasCode to false. -->
    <application android:label="@string/app_name" android:hasCode="false">
        <!-- Our activity is the built-in NativeActivity framework class.
             This will take care of integrating with our NDK code. -->
        <activity android:name="android.app.NativeActivity"
                android:label="@string/app_name"
                android:configChanges="orientation|keyboardHidden">
            <!-- Tell NativeActivity the name of or .so -->
            <meta-data android:name="android.app.lib_name"
                    android:value="native-activity" />
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest> 

そしてここにコードがあります:

EGLDisplay dpy;
EGLSurface surface;
EGLContext context;

static void android_handle_cmd( struct android_app * app, int32_t cmd ) {

    switch (cmd) {

        case APP_CMD_INIT_WINDOW:

            // The window is being shown, get it ready.
            if ( NULL != app->window ) {

                Init( app );
                drawscreen();

            }
            break;

    }

}


void pixel( int x, int y ) {

    if ( NULL == GLapp.surface ) {

        return;

    }    

    glColor4f( 1.0, 1.0, 1.0, 0 );
    glVertexAttrib2f( 0, x + 0.5, y + 0.5 );

}


void drawscreen( void ) {

    if ( NULL == GLapp.surface ) {

        return;

    }

    eglSwapBuffers( GLapp.dpy, GLapp.surface );

}


int Init( struct android_app * app ) {

    dpy = eglGetDisplay( EGL_DEFAULT_DISPLAY );

    eglInitialize( dpy, 0, 0 );

    const EGLint attribs[] = {

        EGL_SURFACE_TYPE,    EGL_WINDOW_BIT,

        EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, // <--- OpenGL ES 2.0

        EGL_BLUE_SIZE,       8,
        EGL_GREEN_SIZE,      8,
        EGL_RED_SIZE,        8,

        EGL_NONE

    };

    EGLConfig config;
    EGLint numConfigs;

    eglChooseConfig( dpy, attribs, &config, 1, &numConfigs );

    EGLint format;

    eglGetConfigAttrib( dpy, config, EGL_NATIVE_VISUAL_ID, &format );

    ANativeWindow_setBuffersGeometry( app->window, 0, 0, format );

    surface = eglCreateWindowSurface( dpy, config, app->window, NULL );

    const EGLint ContextAttribList[] = {

        EGL_CONTEXT_CLIENT_VERSION, 2,
        EGL_NONE

    };

    context = eglCreateContext( GLapp.dpy, config, EGL_NO_CONTEXT, ContextAttribList );

    eglMakeCurrent( dpy, surface, surface, context );

    int XSize;
    eglQuerySurface( GLapp.dpy, GLapp.surface, EGL_WIDTH, &XSize );

    int YSize;
    eglQuerySurface( GLapp.dpy, GLapp.surface, EGL_HEIGHT, &YSize );

    glMatrixMode( GL_PROJECTION );

    glLoadIdentity();

    glOrthof( 0, XSize, YSize, 0, 0, 1 );

    glMatrixMode( GL_MODELVIEW );

    /* Displacement trick for exact pixelization */
    glTranslatef( 0.375, 0.375, 0 );

    glDisable( GL_DEPTH_TEST );

    glClear( GL_COLOR_BUFFER_BIT );

    return 0;

}

コードを読みやすくするために、すべてのエラーチェックコードを削除しました。Init関数は、エラーが検出されることなく実行されます。ログが「未実装のOpenGL ES API」エラーでいっぱいになるのは、ピクセル関数またはドロースクリーン(どちらかわからない)関数を呼び出したときだけです。

誰か助けてもらえますか?

4

2 に答える 2

0

gles 2 を求めていますが、gleMatrixMode などの gles2 API ではないものを使用しています - gl.h を含めないでください。代わりに gles2.h を使用してください。

于 2012-08-22T08:48:45.827 に答える
0

あなたのアプリケーションにはインクルージョンがなく、構築段階で発生する可能性のあるエラーについてもわかりません。

私の提案は、NDK フォルダー内のいくつかのサンプルを見て、それらから学ぶことです。

OpenGL ES コードを使用したネイティブ アクティビティを考慮すると、少なくとも以下を含める必要があります。

#include <jni.h>
#include <errno.h>

#include <EGL/egl.h>
#include <GLES/gl.h>

#include <android/log.h>
#include <android_native_app_glue.h>

しかし、これは単にアイデアを提供するためのものであり、おそらくそれ以上のものが必要になるでしょう.

于 2012-08-21T21:54:52.830 に答える