Refactor android backend JNI calls & fix application context

This commit is contained in:
Nikita Lisitsa 2023-07-20 11:11:02 +03:00
parent 2e569b2cd3
commit 810f64ad76

View file

@ -39,6 +39,22 @@ namespace
{} {}
}; };
template <typename F>
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) 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<sink_impl>()); psemek::log::add_sink(std::make_unique<sink_impl>());
} }
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; psemek::app::application::context context;
auto app = factory->create(factory->options(), context).release(); context.show_cursor = [](bool){};
context.vsync = [](bool){};
auto app = factory->create(factory->options(), context).release();
return reinterpret_cast<jlong>(app); return reinterpret_cast<jlong>(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;
} }
extern "C" void Java_psemek_app_PsemekApplication_destroyNativeApp(JNIEnv *, jclass, jlong ptr) 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<psemek::app::application *>(ptr); delete reinterpret_cast<psemek::app::application *>(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<psemek::app::application *>(ptr); try_native(env, [&]{
app->on_event(psemek::app::resize_event{{width, height}}); auto app = reinterpret_cast<psemek::app::application *>(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");
} }
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<psemek::app::application *>(ptr); try_native(env, [&]{
app->on_event(psemek::app::touch_event{{x, y}}); auto app = reinterpret_cast<psemek::app::application *>(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");
} }
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<psemek::app::application *>(ptr); try_native(env, [&]{
app->update(); auto app = reinterpret_cast<psemek::app::application *>(ptr);
app->present(); 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");
} }