Compare commits

..

1 commit

Author SHA1 Message Date
fc3d3fe3b2
refactor: lpac-jni bridge 2025-03-11 03:43:57 +08:00
6 changed files with 16 additions and 13 deletions

View file

@ -26,7 +26,7 @@ interface HttpInterface {
}
}
fun transmit(url: String, tx: ByteArray, headers: List<String>): HttpResponse
fun transmit(url: String, tx: ByteArray, headers: Array<String>): 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

View file

@ -26,7 +26,7 @@ class HttpInterfaceImpl(
override fun transmit(
url: String,
tx: ByteArray,
headers: List<String>
headers: Array<String>
): HttpInterface.HttpResponse {
Log.d(TAG, "transmit(url = $url)")

View file

@ -63,7 +63,7 @@ class LocalProfileAssistantImpl(
*/
var lastHttpException: Exception? = null
override fun transmit(url: String, tx: ByteArray, headers: List<String>): HttpResponse =
override fun transmit(url: String, tx: ByteArray, headers: Array<String>): HttpResponse =
try {
httpInterface.transmit(url, tx, headers).also {
lastHttpException = null

View file

@ -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;[BLjava/util/List;)Lnet/typeblog/lpac_jni/HttpInterface$HttpResponse;");
"(Ljava/lang/String;[B[Ljava/lang/String;)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,18 +95,19 @@ 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);
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++) {
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++) {
jstring header = toJString(env, headers[i]);
(*env)->CallBooleanMethod(env, header_list, add_header, header);
(*env)->SetObjectArrayElement(env, headersArr, i, header);
(*env)->DeleteLocalRef(env, header);
}
jobject ret = (*env)->CallObjectMethod(env, LPAC_JNI_CTX(ctx)->http_interface,
method_http_transmit, jurl, txArr, header_list);
method_http_transmit, jurl, txArr, headersArr);
LPAC_JNI_EXCEPTION_RETURN;
*rcode = (*env)->GetIntField(env, ret, field_resp_rcode);
jbyteArray rxArr = (jbyteArray) (*env)->GetObjectField(env, ret, field_resp_data);
@ -115,7 +116,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, header_list);
(*env)->DeleteLocalRef(env, headersArr);
(*env)->DeleteLocalRef(env, ret);
return 0;
}

View file

@ -17,7 +17,7 @@ static jclass version_class;
static jmethodID version_constructor;
static jstring empty_string;
static jclass string_class;
jclass string_class;
static jmethodID string_constructor;
jobject bind_static_field(JNIEnv *env, jclass clazz, const char *name, const char *sig) {

View file

@ -17,6 +17,8 @@
#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);