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)
@ -46,26 +62,20 @@ extern "C" void Java_psemek_app_PsemekApplication_setupLogging(JNIEnv *, jclass)
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;
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<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;
return reinterpret_cast<jlong>(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<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);
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<psemek::app::application *>(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<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");
try_native(env, [&]{
auto app = reinterpret_cast<psemek::app::application *>(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<psemek::app::application *>(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<psemek::app::application *>(ptr);
app->update();
app->present();
});
}