diff --git a/libs/android/source/native_app.cpp b/libs/android/source/native_app.cpp index d2a486bb..2bc6917f 100644 --- a/libs/android/source/native_app.cpp +++ b/libs/android/source/native_app.cpp @@ -39,6 +39,22 @@ namespace {} }; + template + auto try_native(JNIEnv * env, F && f) try + { + return f(); + } + catch (std::exception const & e) + { + env->ThrowNew(env->FindClass("java/lang/Exception"), e.what()); + __builtin_unreachable(); + } + catch (...) + { + env->ThrowNew(env->FindClass("java/lang/Exception"), "Unknown exception"); + __builtin_unreachable(); + } + } extern "C" void Java_psemek_app_PsemekApplication_setupLogging(JNIEnv *, jclass) @@ -46,26 +62,20 @@ extern "C" void Java_psemek_app_PsemekApplication_setupLogging(JNIEnv *, jclass) psemek::log::add_sink(std::make_unique()); } -extern "C" jlong Java_psemek_app_PsemekApplication_createNativeApp(JNIEnv * env, jclass) try +extern "C" jlong Java_psemek_app_PsemekApplication_createNativeApp(JNIEnv * env, jclass) { - auto factory = psemek::app::make_application_factory(); + return try_native(env, [&]{ + auto factory = psemek::app::make_application_factory(); - psemek::gfx::init(); + psemek::gfx::init(); - psemek::app::application::context context; - auto app = factory->create(factory->options(), context).release(); + psemek::app::application::context context; + context.show_cursor = [](bool){}; + context.vsync = [](bool){}; + auto app = factory->create(factory->options(), context).release(); - return reinterpret_cast(app); -} -catch (std::exception const & e) -{ - env->ThrowNew(env->FindClass("java/lang/Exception"), e.what()); - return 0; -} -catch (...) -{ - env->ThrowNew(env->FindClass("java/lang/Exception"), "Unknown exception"); - return 0; + return reinterpret_cast(app); + }); } extern "C" void Java_psemek_app_PsemekApplication_destroyNativeApp(JNIEnv *, jclass, jlong ptr) @@ -73,45 +83,27 @@ extern "C" void Java_psemek_app_PsemekApplication_destroyNativeApp(JNIEnv *, jcl delete reinterpret_cast(ptr); } -extern "C" void Java_psemek_app_PsemekApplication_resizeNative(JNIEnv * env, jclass, jlong ptr, jint width, jint height) try +extern "C" void Java_psemek_app_PsemekApplication_resizeNative(JNIEnv * env, jclass, jlong ptr, jint width, jint height) { - auto app = reinterpret_cast(ptr); - app->on_event(psemek::app::resize_event{{width, height}}); -} -catch (std::exception const & e) -{ - env->ThrowNew(env->FindClass("java/lang/Exception"), e.what()); -} -catch (...) -{ - env->ThrowNew(env->FindClass("java/lang/Exception"), "Unknown exception"); + try_native(env, [&]{ + auto app = reinterpret_cast(ptr); + app->on_event(psemek::app::resize_event{{width, height}}); + }); } -extern "C" void Java_psemek_app_PsemekApplication_touchNative(JNIEnv * env, jclass, jlong ptr, jint x, jint y) try +extern "C" void Java_psemek_app_PsemekApplication_touchNative(JNIEnv * env, jclass, jlong ptr, jint x, jint y) { - auto app = reinterpret_cast(ptr); - app->on_event(psemek::app::touch_event{{x, y}}); -} -catch (std::exception const & e) -{ - env->ThrowNew(env->FindClass("java/lang/Exception"), e.what()); -} -catch (...) -{ - env->ThrowNew(env->FindClass("java/lang/Exception"), "Unknown exception"); + try_native(env, [&]{ + auto app = reinterpret_cast(ptr); + app->on_event(psemek::app::touch_event{{x, y}}); + }); } -extern "C" void Java_psemek_app_PsemekApplication_drawFrameNative(JNIEnv * env, jclass, jlong ptr) try +extern "C" void Java_psemek_app_PsemekApplication_drawFrameNative(JNIEnv * env, jclass, jlong ptr) { - auto app = reinterpret_cast(ptr); - app->update(); - app->present(); -} -catch (std::exception const & e) -{ - env->ThrowNew(env->FindClass("java/lang/Exception"), e.what()); -} -catch (...) -{ - env->ThrowNew(env->FindClass("java/lang/Exception"), "Unknown exception"); + try_native(env, [&]{ + auto app = reinterpret_cast(ptr); + app->update(); + app->present(); + }); }