diff --git a/src/native/carbon.cpp b/src/native/carbon.cpp index 7af30af..3b4becc 100644 --- a/src/native/carbon.cpp +++ b/src/native/carbon.cpp @@ -17,6 +17,19 @@ CARBON_JNI_EXCEPTION_CHECK()\ return env->GetStaticObjectField(clazz, id);\ } +// EM = enum mapper +#define CARBON_EM_DEFINE(classpath) const char* enumClassPath = classpath;\ + jclass clazz = env->FindClass(enumClassPath);\ + CARBON_JNI_EXCEPTION_CHECK(); +#define CARBON_EM_SWITCH(block) switch (a) { block } +#define CARBON_EM_CASE(ecase) case ecase: {\ + jfieldID id = env->GetFieldID(clazz, #ecase, enumClassPath);\ + CARBON_JNI_EXCEPTION_CHECK();\ + return env->GetStaticObjectField(clazz, id);\ + } + +#define CARBON_CLASSPATH(jvtype) "Lorg/neoflock/NeoNucleus/" #jvtype +#define CARBON_EM_FROM(jvtype) return Carbon_FromEnum(env, CARBON_CLASSPATH(jvtype), a); // codename for NN JNI is Carbon because i needed something better than NN JNI bool Carbon::PointerBacked::SetPointer(JNIEnv * env, jobject obj, void* ptr) { @@ -85,7 +98,7 @@ jobject Carbon::Map::To_nn_Exit(JNIEnv* env, nn_Exit a) { } return NULL; } -nn_Exit From_nn_Exit(JNIEnv* env, jobject a) { +nn_Exit Carbon::Map::From_nn_Exit(JNIEnv* env, jobject a) { jclass clazz = env->FindClass("org/neoflock/NeoNucleus/nn_Exit"); jmethodID ordMID = env->GetMethodID(clazz, "ordinal", "()I"); jint value = env->CallIntMethod(a, ordMID); @@ -102,12 +115,13 @@ jobject Carbon::Map::To_nn_ComputerState(JNIEnv* env, nn_ComputerState a) { CARBON_MAP_TO_NN_COMPUTERSTATE(NN_BLACKOUT) CARBON_MAP_TO_NN_COMPUTERSTATE(NN_CHARCH) } + return NULL; } -nn_Exit From_nn_ComputerState(JNIEnv* env, jobject a) { +nn_ComputerState Carbon::Map::From_nn_ComputerState(JNIEnv* env, jobject a) { jclass clazz = env->FindClass("org/neoflock/NeoNucleus/nn_ComputerState"); jmethodID ordMID = env->GetMethodID(clazz, "ordinal", "()I"); jint value = env->CallIntMethod(a, ordMID); - return (nn_Exit) value; + return (nn_ComputerState) value; } jobject Carbon::Map::To_nn_Architecture(JNIEnv* env, nn_Architecture a) { jclass clazz = env->FindClass("org/neoflock/NeoNucleus/nn_Architecture"); @@ -130,6 +144,31 @@ jobject Carbon::Map::To_nn_Architecture(JNIEnv* env, nn_Architecture a) { printf("return\n"); return obj; } + +jobject Carbon::Map::To_nn_EnvironmentAction(JNIEnv *env, nn_EnvironmentAction a) +{ + CARBON_EM_DEFINE("Lorg/neoflock/NeoNucleus/nn_EnvironmentAction"); + CARBON_EM_SWITCH( + CARBON_EM_CASE(NN_ENV_DRAWENERGY) + CARBON_EM_CASE(NN_ENV_POWERON) + CARBON_EM_CASE(NN_ENV_POWEROFF) + CARBON_EM_CASE(NN_ENV_CRASHED) + CARBON_EM_CASE(NN_ENV_BEEP) + CARBON_EM_CASE(NN_ENV_BEEPMORSE) + ) + return NULL; +} + +template T Carbon_FromEnum(JNIEnv* env, const char* classpath, jobject a) { + jclass clazz = env->FindClass(classpath); + jmethodID ordMID = env->GetMethodID(clazz, "ordinal", "()I"); + jint value = env->CallIntMethod(a, ordMID); + return (T) value; +} +nn_EnvironmentAction Carbon::Map::From_nn_EnvironmentAction(JNIEnv* env, jobject a) + { CARBON_EM_FROM(nn_EnvironmentAction); } + + namespace Carbon::Exceptions { CARBON_EXCEPTION_FUNC(ThrowNullPtr, "java/lang/NullPointerException"); } \ No newline at end of file diff --git a/src/native/carbon.hpp b/src/native/carbon.hpp index 3db712e..283ebae 100644 --- a/src/native/carbon.hpp +++ b/src/native/carbon.hpp @@ -24,11 +24,14 @@ namespace Carbon { bool ResetPointer(JNIEnv * env, jobject obj); } namespace Map { + //template T FromEnum(JNIEnv* env, const char* classpath, T a); jobject To_nn_Exit(JNIEnv* env, nn_Exit a); nn_Exit From_nn_Exit(JNIEnv* env, jobject a); jobject To_nn_ComputerState(JNIEnv* env, nn_ComputerState a); nn_ComputerState From_nn_ComputerState(JNIEnv* env, jobject a); jobject To_nn_Architecture(JNIEnv* env, nn_Architecture a); + nn_EnvironmentAction From_nn_EnvironmentAction(JNIEnv* env, jobject a); + jobject To_nn_EnvironmentAction(JNIEnv* env, nn_EnvironmentAction a); } typedef struct JavaObjectTarget { // i might lowkey drop this struct