Refactor android backend JNI calls & fix application context
This commit is contained in:
parent
2e569b2cd3
commit
810f64ad76
1 changed files with 42 additions and 50 deletions
|
|
@ -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");
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue