diff --git a/libs/lpac-jni/src/main/java/net/typeblog/lpac_jni/HttpInterface.kt b/libs/lpac-jni/src/main/java/net/typeblog/lpac_jni/HttpInterface.kt index 49d6cc0..3306ba8 100644 --- a/libs/lpac-jni/src/main/java/net/typeblog/lpac_jni/HttpInterface.kt +++ b/libs/lpac-jni/src/main/java/net/typeblog/lpac_jni/HttpInterface.kt @@ -26,7 +26,7 @@ interface HttpInterface { } } - fun transmit(url: String, tx: ByteArray, headers: Array): HttpResponse + fun transmit(url: String, tx: ByteArray, headers: List): HttpResponse // The LPA is supposed to pass in a list of pkIds supported by the eUICC. // HttpInterface is responsible for providing TrustManager implementations that // validate based on certificates corresponding to these pkIds diff --git a/libs/lpac-jni/src/main/java/net/typeblog/lpac_jni/impl/HttpInterfaceImpl.kt b/libs/lpac-jni/src/main/java/net/typeblog/lpac_jni/impl/HttpInterfaceImpl.kt index c1b15f7..d3775fd 100644 --- a/libs/lpac-jni/src/main/java/net/typeblog/lpac_jni/impl/HttpInterfaceImpl.kt +++ b/libs/lpac-jni/src/main/java/net/typeblog/lpac_jni/impl/HttpInterfaceImpl.kt @@ -26,7 +26,7 @@ class HttpInterfaceImpl( override fun transmit( url: String, tx: ByteArray, - headers: Array + headers: List ): HttpInterface.HttpResponse { Log.d(TAG, "transmit(url = $url)") diff --git a/libs/lpac-jni/src/main/java/net/typeblog/lpac_jni/impl/LocalProfileAssistantImpl.kt b/libs/lpac-jni/src/main/java/net/typeblog/lpac_jni/impl/LocalProfileAssistantImpl.kt index c6f3cbf..2343f1a 100644 --- a/libs/lpac-jni/src/main/java/net/typeblog/lpac_jni/impl/LocalProfileAssistantImpl.kt +++ b/libs/lpac-jni/src/main/java/net/typeblog/lpac_jni/impl/LocalProfileAssistantImpl.kt @@ -63,7 +63,7 @@ class LocalProfileAssistantImpl( */ var lastHttpException: Exception? = null - override fun transmit(url: String, tx: ByteArray, headers: Array): HttpResponse = + override fun transmit(url: String, tx: ByteArray, headers: List): HttpResponse = try { httpInterface.transmit(url, tx, headers).also { lastHttpException = null 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 702ba45..3f2dff1 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 @@ -26,7 +26,7 @@ void interface_wrapper_init(JNIEnv *env) { jclass http_class = (*env)->FindClass(env, "net/typeblog/lpac_jni/HttpInterface"); method_http_transmit = (*env)->GetMethodID(env, http_class, "transmit", - "(Ljava/lang/String;[B[Ljava/lang/String;)Lnet/typeblog/lpac_jni/HttpInterface$HttpResponse;"); + "(Ljava/lang/String;[BLjava/util/List;)Lnet/typeblog/lpac_jni/HttpInterface$HttpResponse;"); jclass resp_class = (*env)->FindClass(env, "net/typeblog/lpac_jni/HttpInterface$HttpResponse"); field_resp_rcode = (*env)->GetFieldID(env, resp_class, "rcode", "I"); @@ -95,19 +95,18 @@ http_interface_transmit(struct euicc_ctx *ctx, const char *url, uint32_t *rcode, jbyteArray txArr = (*env)->NewByteArray(env, (jsize) tx_len); (*env)->SetByteArrayRegion(env, txArr, 0, (jsize) tx_len, (const jbyte *) tx); - int num_headers = 0; - while (headers[num_headers] != NULL) { - num_headers++; - } - jobjectArray headersArr = (*env)->NewObjectArray(env, num_headers, string_class, NULL); - for (int i = 0; i < num_headers; i++) { + jobject header_list = new_array_list(env); + jclass header_list_class = (*env)->GetObjectClass(env, header_list); + jmethodID add_header = (*env)->GetMethodID(env, header_list_class, "add", "(Ljava/lang/Object;)Z"); + + for (int i = 0; headers[i] != NULL; i++) { jstring header = toJString(env, headers[i]); - (*env)->SetObjectArrayElement(env, headersArr, i, header); + (*env)->CallBooleanMethod(env, header_list, add_header, header); (*env)->DeleteLocalRef(env, header); } jobject ret = (*env)->CallObjectMethod(env, LPAC_JNI_CTX(ctx)->http_interface, - method_http_transmit, jurl, txArr, headersArr); + method_http_transmit, jurl, txArr, header_list); LPAC_JNI_EXCEPTION_RETURN; *rcode = (*env)->GetIntField(env, ret, field_resp_rcode); jbyteArray rxArr = (jbyteArray) (*env)->GetObjectField(env, ret, field_resp_data); @@ -116,7 +115,7 @@ http_interface_transmit(struct euicc_ctx *ctx, const char *url, uint32_t *rcode, (*env)->GetByteArrayRegion(env, rxArr, 0, (jsize) *rx_len, (jbyte *) *rx); (*env)->DeleteLocalRef(env, txArr); (*env)->DeleteLocalRef(env, rxArr); - (*env)->DeleteLocalRef(env, headersArr); + (*env)->DeleteLocalRef(env, header_list); (*env)->DeleteLocalRef(env, ret); return 0; } diff --git a/libs/lpac-jni/src/main/jni/lpac-jni/lpac-convertor.c b/libs/lpac-jni/src/main/jni/lpac-jni/lpac-convertor.c index 1b1518d..da714ac 100644 --- a/libs/lpac-jni/src/main/jni/lpac-jni/lpac-convertor.c +++ b/libs/lpac-jni/src/main/jni/lpac-jni/lpac-convertor.c @@ -17,7 +17,7 @@ static jclass version_class; static jmethodID version_constructor; static jstring empty_string; -jclass string_class; +static jclass string_class; static jmethodID string_constructor; jobject bind_static_field(JNIEnv *env, jclass clazz, const char *name, const char *sig) { diff --git a/libs/lpac-jni/src/main/jni/lpac-jni/lpac-convertor.h b/libs/lpac-jni/src/main/jni/lpac-jni/lpac-convertor.h index dfed36b..cc7c568 100644 --- a/libs/lpac-jni/src/main/jni/lpac-jni/lpac-convertor.h +++ b/libs/lpac-jni/src/main/jni/lpac-jni/lpac-convertor.h @@ -17,8 +17,6 @@ #define HASH_SET_CLASS "java/util/HashSet" #define ARRAY_LIST_CLASS "java/util/ArrayList" -jclass string_class; - void lpac_convertor_init(JNIEnv *env); jstring toJString(JNIEnv *env, const char *pat);