【002】renPy android端启动流程分析

发布于:2025-05-13 ⋅ 阅读:(12) ⋅ 点赞:(0)

 接上篇分析

org.renpy.android.PythonSDLActivity#onCreate

 它先调用了

org.libsdl.app.SDLActivity#onCreate
源码如下:
@Override  // android.app.Activity
protected void onCreate(Bundle bundle0) {
    //1. 日志记录
    String s;
    Log.v("SDL", "Device: " + Build.DEVICE);
    Log.v("SDL", "Model: " + Build.MODEL);
    Log.v("SDL", "onCreate()");
    super.onCreate(bundle0);
    try {
       // 2. 设置线程名称
        Thread.currentThread().setName("SDLActivity");
    }
    catch(Exception exception0) {
        Log.v("SDL", "modify thread properties failed " + exception0.toString());
    }
//3. 加载本地库
    try {
        this.loadLibraries();
        SDLActivity.mBrokenLibraries = false;
        s = "";
    }
    catch(UnsatisfiedLinkError unsatisfiedLinkError0) {
        System.err.println(unsatisfiedLinkError0.getMessage());
        SDLActivity.mBrokenLibraries = true;
        s = unsatisfiedLinkError0.getMessage();
    }
    catch(Exception exception1) {
        System.err.println(exception1.getMessage());
        SDLActivity.mBrokenLibraries = true;
        s = exception1.getMessage();
    }

    if(SDLActivity.mBrokenLibraries) {
        SDLActivity.mSingleton = this;
        AlertDialog.Builder alertDialog$Builder0 = new AlertDialog.Builder(this);
        alertDialog$Builder0.setMessage("An error occurred while trying to start the application. Please try again and/or reinstall.\n\nError: " + s);
        alertDialog$Builder0.setTitle("SDL Error");
        alertDialog$Builder0.setPositiveButton("Exit", new DialogInterface.OnClickListener() {
            @Override  // android.content.DialogInterface$OnClickListener
            public void onClick(DialogInterface dialogInterface0, int v) {
                SDLActivity.mSingleton.finish();
            }
        });
        alertDialog$Builder0.setCancelable(false);
        alertDialog$Builder0.create().show();
        return;
    }
    //5. 初始化 SDL JNI 接口
    SDL.setupJNI();
   // 6. 全局状态初始化
    SDL.initialize();
    SDLActivity.mSingleton = this;
    SDL.setContext(this);
    SDLActivity.mClipboardHandler = new SDLClipboardHandler();
    SDLActivity.mSurface = new SDLSurface(this.getApplication());
    RelativeLayout relativeLayout0 = new RelativeLayout(this);
    SDLActivity.mLayout = relativeLayout0;
    relativeLayout0.addView(SDLActivity.mSurface);
    int v = SDLActivity.getCurrentOrientation();
    SDLActivity.mCurrentOrientation = v;
    SDLActivity.onNativeOrientationChanged(v);
    try {
        SDLActivity.mCurrentLocale = Build.VERSION.SDK_INT < 24 ? SDLActivity.getContext().getResources().getConfiguration().locale : SDLActivity.getContext().getResources().getConfiguration().getLocales().get(0);
    }
    catch(Exception unused_ex) {
    }
    //7. 设置内容视图
    this.setContentView(SDLActivity.mLayout);
    //8. 窗口样式与 UI 设置
    SDLActivity.setWindowStyle(false);
    this.getWindow().getDecorView().setOnSystemUiVisibilityChangeListener(this);
    //9. 处理 Intent 数据(如文件路径)
    Intent intent0 = this.getIntent();
    if(intent0 != null && intent0.getData() != null) {
        String s1 = intent0.getData().getPath();
        if(s1 != null) {
            Log.v("SDL", "Got filename: " + s1);
            SDLActivity.onNativeDropFile(s1);
        }
    }
}


功能
描述
日志输出
输出设备信息和生命周期状态,便于调试
本地库加载
加载 SDL 核心库和游戏逻辑库
异常处理
处理加载失败的情况并提示用户
JNI 初始化
设置 Java 与 C/C++ 交互的基础环境
UI 初始化
创建 SDLSurface 并设置为内容视图
全局状态管理
初始化 SDL 相关的全局状态和事件处理器
Intent 支持
支持通过 Intent 传入外部数据(如文件路径)

实际加载的是

@Override  // org.libsdl.app.SDLActivity
protected String[] getLibraries() {
    return new String[]{"renpython"};
}

里面有一堆native的方法