接上篇分析
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的方法