diff --git a/libs/lpac-jni/src/main/jni/lpac-jni/interface-wrapper.c b/libs/lpac-jni/src/main/jni/lpac-jni/interface-wrapper.c index a61fc96..df27e92 100644 --- a/libs/lpac-jni/src/main/jni/lpac-jni/interface-wrapper.c +++ b/libs/lpac-jni/src/main/jni/lpac-jni/interface-wrapper.c @@ -13,8 +13,7 @@ jmethodID method_http_transmit; jfieldID field_resp_rcode; jfieldID field_resp_data; -void interface_wrapper_init() { - LPAC_JNI_SETUP_ENV; +void interface_wrapper_init(JNIEnv *env) { jclass apdu_class = (*env)->FindClass(env, "net/typeblog/lpac_jni/ApduInterface"); method_apdu_connect = (*env)->GetMethodID(env, apdu_class, "connect", "()V"); method_apdu_disconnect = (*env)->GetMethodID(env, apdu_class, "disconnect", "()V"); diff --git a/libs/lpac-jni/src/main/jni/lpac-jni/interface-wrapper.h b/libs/lpac-jni/src/main/jni/lpac-jni/interface-wrapper.h index e22837b..fec3869 100644 --- a/libs/lpac-jni/src/main/jni/lpac-jni/interface-wrapper.h +++ b/libs/lpac-jni/src/main/jni/lpac-jni/interface-wrapper.h @@ -5,7 +5,7 @@ #include #include "lpac-jni.h" -void interface_wrapper_init(); +void interface_wrapper_init(JNIEnv *env); extern struct euicc_apdu_interface lpac_jni_apdu_interface; extern struct euicc_http_interface lpac_jni_http_interface; diff --git a/libs/lpac-jni/src/main/jni/lpac-jni/lpac-download.c b/libs/lpac-jni/src/main/jni/lpac-jni/lpac-download.c index bae2ee8..33c5b81 100644 --- a/libs/lpac-jni/src/main/jni/lpac-jni/lpac-download.c +++ b/libs/lpac-jni/src/main/jni/lpac-jni/lpac-download.c @@ -13,49 +13,34 @@ jobject download_state_finalizing; jmethodID on_state_update; -void lpac_download_init() { - LPAC_JNI_SETUP_ENV; +#define DOWNLOAD_CALLBACK_CLASS "net/typeblog/lpac_jni/ProfileDownloadCallback" +#define DOWNLOAD_STATE_CLASS DOWNLOAD_CALLBACK_CLASS "$DownloadState" - jclass download_state_class = (*env)->FindClass(env, - "net/typeblog/lpac_jni/ProfileDownloadCallback$DownloadState"); - jfieldID download_state_preparing_field = (*env)->GetStaticFieldID(env, download_state_class, - "Preparing", - "Lnet/typeblog/lpac_jni/ProfileDownloadCallback$DownloadState;"); - download_state_preparing = (*env)->GetStaticObjectField(env, download_state_class, - download_state_preparing_field); - download_state_preparing = (*env)->NewGlobalRef(env, download_state_preparing); - jfieldID download_state_connecting_field = (*env)->GetStaticFieldID(env, download_state_class, - "Connecting", - "Lnet/typeblog/lpac_jni/ProfileDownloadCallback$DownloadState;"); - download_state_connecting = (*env)->GetStaticObjectField(env, download_state_class, - download_state_connecting_field); - download_state_connecting = (*env)->NewGlobalRef(env, download_state_connecting); - jfieldID download_state_authenticating_field = (*env)->GetStaticFieldID(env, - download_state_class, - "Authenticating", - "Lnet/typeblog/lpac_jni/ProfileDownloadCallback$DownloadState;"); - download_state_authenticating = (*env)->GetStaticObjectField(env, download_state_class, - download_state_authenticating_field); - download_state_authenticating = (*env)->NewGlobalRef(env, download_state_authenticating); - jfieldID download_state_downloading_field = (*env)->GetStaticFieldID(env, download_state_class, - "Downloading", - "Lnet/typeblog/lpac_jni/ProfileDownloadCallback$DownloadState;"); - download_state_downloading = (*env)->GetStaticObjectField(env, download_state_class, - download_state_downloading_field); - download_state_downloading = (*env)->NewGlobalRef(env, download_state_downloading); - jfieldID download_state_finalizng_field = (*env)->GetStaticFieldID(env, download_state_class, - "Finalizing", - "Lnet/typeblog/lpac_jni/ProfileDownloadCallback$DownloadState;"); - download_state_finalizing = (*env)->GetStaticObjectField(env, download_state_class, - download_state_finalizng_field); - download_state_finalizing = (*env)->NewGlobalRef(env, download_state_finalizing); - - jclass download_callback_class = (*env)->FindClass(env, - "net/typeblog/lpac_jni/ProfileDownloadCallback"); - on_state_update = (*env)->GetMethodID(env, download_callback_class, "onStateUpdate", - "(Lnet/typeblog/lpac_jni/ProfileDownloadCallback$DownloadState;)V"); +static jobject bind_static_field(JNIEnv *env, jclass clazz, const char *name, const char *sig) { + jfieldID field = (*env)->GetStaticFieldID(env, clazz, name, sig); + jobject bound = (*env)->GetStaticObjectField(env, clazz, field); + return (*env)->NewGlobalRef(env, bound); } +#define BIND_DOWNLOAD_STATE_STATIC_FIELD(NAME, FIELD) \ + download_state_##NAME = bind_static_field(env, download_state_class, FIELD, "L" DOWNLOAD_STATE_CLASS ";") + +void lpac_download_init(JNIEnv *env) { + jclass download_state_class = (*env)->FindClass(env, DOWNLOAD_STATE_CLASS); + + BIND_DOWNLOAD_STATE_STATIC_FIELD(preparing, "Preparing"); + BIND_DOWNLOAD_STATE_STATIC_FIELD(connecting, "Connecting"); + BIND_DOWNLOAD_STATE_STATIC_FIELD(authenticating, "Authenticating"); + BIND_DOWNLOAD_STATE_STATIC_FIELD(downloading, "Downloading"); + BIND_DOWNLOAD_STATE_STATIC_FIELD(finalizing, "Finalizing"); + + jclass download_callback_class = (*env)->FindClass(env, DOWNLOAD_CALLBACK_CLASS); + on_state_update = (*env)->GetMethodID( + env, download_callback_class, "onStateUpdate", "(L" DOWNLOAD_STATE_CLASS ";)V"); +} + +#undef BIND_DOWNLOAD_STATE_STATIC_FIELD + JNIEXPORT jint JNICALL Java_net_typeblog_lpac_1jni_LpacJni_downloadProfile(JNIEnv *env, jobject thiz, jlong handle, jstring smdp, jstring matching_id, diff --git a/libs/lpac-jni/src/main/jni/lpac-jni/lpac-download.h b/libs/lpac-jni/src/main/jni/lpac-jni/lpac-download.h index 7130f52..b68bc99 100644 --- a/libs/lpac-jni/src/main/jni/lpac-jni/lpac-download.h +++ b/libs/lpac-jni/src/main/jni/lpac-jni/lpac-download.h @@ -3,4 +3,4 @@ #include #include "lpac-jni.h" -void lpac_download_init(); \ No newline at end of file +void lpac_download_init(JNIEnv *env); \ No newline at end of file diff --git a/libs/lpac-jni/src/main/jni/lpac-jni/lpac-jni.c b/libs/lpac-jni/src/main/jni/lpac-jni/lpac-jni.c index ca319db..f0aa917 100644 --- a/libs/lpac-jni/src/main/jni/lpac-jni/lpac-jni.c +++ b/libs/lpac-jni/src/main/jni/lpac-jni/lpac-jni.c @@ -19,10 +19,11 @@ jmethodID string_constructor; jint JNI_OnLoad(JavaVM *vm, void *reserved) { jvm = vm; - interface_wrapper_init(); - lpac_download_init(); - LPAC_JNI_SETUP_ENV; + + interface_wrapper_init(env); + lpac_download_init(env); + string_class = (*env)->FindClass(env, "java/lang/String"); string_class = (*env)->NewGlobalRef(env, string_class); string_constructor = (*env)->GetMethodID(env, string_class, "",