2

我正在尝试在 android 上运行我的第一个 SDL hello-world 项目。我使用 SDL 源码包中提供的 android 项目模板,它使用一个名为 SDLActivity 的类与 android 和原生 c/c++ 代码进行通信。我将它们导入 Eclipse android 项目,然后稍微修改 AndroidManifest.xml、文件夹 jni 中的 Application.mk 和文件夹 jni/src 中的 Android.mk。

项目编译成功。但是当它在模拟器上运行时(我使用 GenyMotion),我在 logcat 中收到错误消息。

E/SDLActivity(1472): Failed loading eglChooseConfig: Invalid library handle

我也尝试在真实设备上进行调试。我收到了这条消息:

E/SDLActivity(28020): Failed loading eglChooseConfig: dlsym library handle is null

我尝试添加“System.loadLibrary("EGL");” 在 SDLActivity.java 中。不行。

这是我在 jni/src 中的 Android.mk

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := main

SDL_PATH := ../SDL

LOCAL_C_INCLUDES := $(LOCAL_PATH)/$(SDL_PATH)/include

# Add your application source files here...
LOCAL_SRC_FILES :=  $(SDL_PATH)/src/main/android/SDL_android_main.c \
main.cpp

LOCAL_SHARED_LIBRARIES :=SDL2

LOCAL_LDLIBS := -lGLESv1_CM -lGLESv2 -llog -lEGL

include $(BUILD_SHARED_LIBRARY)
4

1 回答 1

1

我最终在 youtube 上找到了一个很好的教程。我关注了这个视频,我的应用程序运行良好。我已经在虚拟和真实设备上测试了我的应用程序。

这是 youtube 记录器使用的示例代码。我不是下面代码的作者。只是在这里放一个副本。

#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include "SDL.h"
int main(int argc, char *argv[])
{
    SDL_Window* window = 0;
    SDL_GLContext gl = 0;
    if(0 != SDL_Init(SDL_INIT_VIDEO))
    {
        fprintf(stderr,"Unable to initialize SDL: %s\n",SDL_GetError());
        return 1;
    }
    SDL_LogSetAllPriority(SDL_LOG_PRIORITY_VERBOSE);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK,    SDL_GL_CONTEXT_PROFILE_ES);
    SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION,2);
    SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER,1);
    SDL_DisplayMode mode;
    SDL_GetDisplayMode(0,0,&mode);
    int width = mode.w;
    int height = mode.h;
    SDL_Log("Width = %d, Heigh = %d. \n",width,height);
    SDL_GL_SetAttribute(SDL_GL_ACCELERATED_VISUAL,1);
    SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER,1);
    SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE,24);
    window = SDL_CreateWindow(NULL,0,0,width,height,SDL_WINDOW_OPENGL | SDL_WINDOW_FULLSCREEN | SDL_WINDOW_RESIZABLE);
    if(window == 0)
    {
        SDL_Log("Failed to create window.");
        SDL_Quit();
        return 1;
    }
    //Create an opengl context
    gl = SDL_GL_CreateContext(window);
    /*Main Render Loop*/
    Uint8 done = 0;
    SDL_Event event;
    int count = 0;
    while(!done)
    {
        /*Check for events*/
        while(SDL_PollEvent(&event))
        {
            if(event.type == SDL_QUIT || event.type == SDL_KEYDOWN || event.type == SDL_FINGERDOWN)
            {
                done = 1;
            }
        }
        SDL_Log("%d\n",count++);
        SDL_GL_SwapWindow(window);
        SDL_Delay(10);
    }
    exit(0);
}

此代码将让您知道如何在 android 上初始化 SDL。需要注意一件事:openGL ES 的版本需要正确设置。比如我用的是openGLES 1.1,所以我改

SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION,2);

SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION,1);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION,1);
于 2015-07-04T15:50:31.413 回答