@@ -1,5 +1,6 @@
11#include <jni.h>
22#include <assert.h>
3+#include <stdlib.h>
34#include <android/log.h>
45#include <HaskellActivity.h>
56#include "MainWidget.h"
@@ -29,7 +30,7 @@ jobject Reflex_Dom_Android_MainWidget_start(jobject activity, const char *url, c
2930 return (*env)->NewGlobalRef(env, result);
3031}
3132
32−void Reflex_Dom_Android_MainWidget_runJS(jobject jsExecutor, const char* js) {
33+void Reflex_Dom_Android_MainWidget_runJS(jobject jsExecutor, const char* js, size_t js_len) {
3334 JNIEnv *env;
3435 jint attachResult = (*HaskellActivity_jvm)->AttachCurrentThread(HaskellActivity_jvm, &env, NULL);
3536 assert (attachResult == JNI_OK);
@@ -39,9 +40,10 @@ void Reflex_Dom_Android_MainWidget_runJS(jobject jsExecutor, const char* js) {
3940 //TODO: Don't search for this method every time
4041 jclass cls = (*env)->GetObjectClass(env, jsExecutor);
4142 assert(cls);
42− jmethodID evaluateJavascript = (*env)->GetMethodID(env, cls, "evaluateJavascript", "(Ljava/lang/String;)V");
43+ jmethodID evaluateJavascript = (*env)->GetMethodID(env, cls, "evaluateJavascript", "([B)V");
4344 assert(evaluateJavascript);
44− jstring js_str = (*env)->NewStringUTF(env, js);
45+ jbyteArray js_str = (*env)->NewByteArray(env, js_len);
46+ (*env)->SetByteArrayRegion(env, js_str, 0, js_len, (const jbyte*)js);
4547 (*env)->CallVoidMethod(env, jsExecutor, evaluateJavascript, js_str, 0);
4648 if((*env)->ExceptionOccurred(env)) {
4749 __android_log_write(ANDROID_LOG_DEBUG, "MainWidget", "runJS exception");
@@ -57,20 +59,31 @@ JNIEXPORT void JNICALL Java_org_reflexfrp_reflexdom_MainWidget_00024JSaddleCallb
5759 return;
5860}
5961
60−JNIEXPORT void JNICALL Java_org_reflexfrp_reflexdom_MainWidget_00024JSaddleCallbacks_processMessage (JNIEnv *env, jobject thisObj, jlong callbacksLong, jstring msg) {
62+JNIEXPORT void JNICALL Java_org_reflexfrp_reflexdom_MainWidget_00024JSaddleCallbacks_processMessage (JNIEnv *env, jobject thisObj, jlong callbacksLong, jbyteArray msg) {
6163 const JSaddleCallbacks *callbacks = (const JSaddleCallbacks *)callbacksLong;
62− const char *msg_str = (*env)->GetStringUTFChars(env, msg, NULL);
63− (*(callbacks->jsaddleResult))(msg_str);
64− (*env)->ReleaseStringUTFChars(env, msg, msg_str);
64+
65+ jbyte *msg_str = (*env)->GetByteArrayElements(env, msg, NULL);
66+ jsize msg_str_len = (*env)->GetArrayLength(env, msg);
67+ (*(callbacks->jsaddleResult))(msg_str, msg_str_len);
68+ (*env)->ReleaseByteArrayElements(env, msg, msg_str, JNI_ABORT);
6569 return;
6670}
6771
68−JNIEXPORT jstring JNICALL Java_org_reflexfrp_reflexdom_MainWidget_00024JSaddleCallbacks_processSyncMessage (JNIEnv *env, jobject thisObj, jlong callbacksLong, jstring msg) {
72+JNIEXPORT jbyteArray JNICALL Java_org_reflexfrp_reflexdom_MainWidget_00024JSaddleCallbacks_processSyncMessage (JNIEnv *env, jobject thisObj, jlong callbacksLong, jbyteArray msg) {
6973 const JSaddleCallbacks *callbacks = (const JSaddleCallbacks *)callbacksLong;
70− const char *msg_str = (*env)->GetStringUTFChars(env, msg, NULL);
71− char *next_str = (*(callbacks->jsaddleSyncResult))(msg_str);
72− jstring next_jstr = (*env)->NewStringUTF(env,next_str);
74+
75+ char const *next_str;
76+ size_t next_str_len;
77+
78+ jbyte *msg_str = (*env)->GetByteArrayElements(env, msg, NULL);
79+ jsize msg_str_len = (*env)->GetArrayLength(env, msg);
80+ (*(callbacks->jsaddleSyncResult))(msg_str, msg_str_len, &next_str, &next_str_len);
81+ (*env)->ReleaseByteArrayElements(env, msg, msg_str, JNI_ABORT);
82+
83+ jbyteArray next_jstr = (*env)->NewByteArray(env, next_str_len);
84+ (*env)->SetByteArrayRegion(env, next_jstr, 0, next_str_len, next_str);
85+
7386 free(next_str);
74− (*env)->ReleaseStringUTFChars(env, msg, msg_str);
87+
7588 return next_jstr;
7689}