@@ -1,5 +1,6 @@
1#include <jni.h>
1#include <jni.h>
2#include <assert.h>
2#include <assert.h>
3#include <android/log.h>
4#include <android/log.h>
4#include <HaskellActivity.h>
5#include <HaskellActivity.h>
5#include "MainWidget.h"
6#include "MainWidget.h"
@@ -29,7 +30,7 @@ jobject Reflex_Dom_Android_MainWidget_start(jobject activity, const char *url, c
29 return (*env)->NewGlobalRef(env, result);
30 return (*env)->NewGlobalRef(env, result);
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) {
33 JNIEnv *env;
34 JNIEnv *env;
34 jint attachResult = (*HaskellActivity_jvm)->AttachCurrentThread(HaskellActivity_jvm, &env, NULL);
35 jint attachResult = (*HaskellActivity_jvm)->AttachCurrentThread(HaskellActivity_jvm, &env, NULL);
35 assert (attachResult == JNI_OK);
36 assert (attachResult == JNI_OK);
@@ -39,9 +40,10 @@ void Reflex_Dom_Android_MainWidget_runJS(jobject jsExecutor, const char* js) {
39 //TODO: Don't search for this method every time
40 //TODO: Don't search for this method every time
40 jclass cls = (*env)->GetObjectClass(env, jsExecutor);
41 jclass cls = (*env)->GetObjectClass(env, jsExecutor);
41 assert(cls);
42 assert(cls);
42− jmethodID evaluateJavascript = (*env)->GetMethodID(env, cls, "evaluateJavascript", "(Ljava/lang/String;)V");
43+ jmethodID evaluateJavascript = (*env)->GetMethodID(env, cls, "evaluateJavascript", "([B)V");
43 assert(evaluateJavascript);
44 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);
45 (*env)->CallVoidMethod(env, jsExecutor, evaluateJavascript, js_str, 0);
47 (*env)->CallVoidMethod(env, jsExecutor, evaluateJavascript, js_str, 0);
46 if((*env)->ExceptionOccurred(env)) {
48 if((*env)->ExceptionOccurred(env)) {
47 __android_log_write(ANDROID_LOG_DEBUG, "MainWidget", "runJS exception");
49 __android_log_write(ANDROID_LOG_DEBUG, "MainWidget", "runJS exception");
@@ -57,20 +59,31 @@ JNIEXPORT void JNICALL Java_org_reflexfrp_reflexdom_MainWidget_00024JSaddleCallb
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) {
61 const JSaddleCallbacks *callbacks = (const JSaddleCallbacks *)callbacksLong;
63 const JSaddleCallbacks *callbacks = (const JSaddleCallbacks *)callbacksLong;
62− const char *msg_str = (*env)->GetStringUTFChars(env, msg, NULL);
65+ jbyte *msg_str = (*env)->GetByteArrayElements(env, msg, NULL);
66+ jsize msg_str_len = (*env)->GetArrayLength(env, msg);
63− (*(callbacks->jsaddleResult))(msg_str);
67+ (*(callbacks->jsaddleResult))(msg_str, msg_str_len);
64− (*env)->ReleaseStringUTFChars(env, msg, msg_str);
68+ (*env)->ReleaseByteArrayElements(env, msg, msg_str, JNI_ABORT);
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) {
69 const JSaddleCallbacks *callbacks = (const JSaddleCallbacks *)callbacksLong;
73 const JSaddleCallbacks *callbacks = (const JSaddleCallbacks *)callbacksLong;
75+ char const *next_str;
70− const char *msg_str = (*env)->GetStringUTFChars(env, msg, NULL);
78+ jbyte *msg_str = (*env)->GetByteArrayElements(env, msg, NULL);
79+ jsize msg_str_len = (*env)->GetArrayLength(env, msg);
71− char *next_str = (*(callbacks->jsaddleSyncResult))(msg_str);
80+ (*(callbacks->jsaddleSyncResult))(msg_str, msg_str_len, &next_str, &next_str_len);
72− jstring next_jstr = (*env)->NewStringUTF(env,next_str);
81+ (*env)->ReleaseByteArrayElements(env, msg, msg_str, JNI_ABORT);
83+ jbyteArray next_jstr = (*env)->NewByteArray(env, next_str_len);
84+ (*env)->SetByteArrayRegion(env, next_jstr, 0, next_str_len, next_str);
73 free(next_str);
86 free(next_str);
74− (*env)->ReleaseStringUTFChars(env, msg, msg_str);
87+
75 return next_jstr;
88 return next_jstr;