@@ -21,8 +21,6 @@ along with LiveCode. If not see <http://www.gnu.org/licenses/>. */
2121#include " parsedef.h"
2222#include " exec.h"
2323
24-
25-
2624#include " mblandroidjava.h"
2725
2826#include < jni.h>
@@ -500,6 +498,38 @@ bool MCJavaStringFromNative(JNIEnv *env, const char *p_string, jstring &r_java_s
500498 }
501499}
502500
501+ bool MCJavaStringFromUTF8 (JNIEnv *env, const char *p_string, jstring &r_java_string)
502+ {
503+ if (p_string == nil)
504+ {
505+ r_java_string = nil;
506+ return true ;
507+ }
508+
509+ /* The JNI NewStringUTF function expected Modified UTF-8 which encodes NUL
510+ * as two bytes, and SMP chars as two surrogates. This differs from the
511+ * encoding of p_string, which is standard UTF-8. Therefore, we convert
512+ * p_string to UTF-16, and then use NewString instead. */
513+
514+ /* Create a StringRef from the UTF-8, which does the necessary conversion
515+ * to UTF-16. */
516+ MCAutoStringRef t_string;
517+ if (!MCStringCreateWithBytes ((const char_t *)p_string, strlen (p_string), kMCStringEncodingUTF8 , false , &t_string))
518+ {
519+ return false ;
520+ }
521+
522+ /* Now lock the content of the stringref as UTF-16 so we can pass the buffer
523+ * and length to the JNI function. */
524+ MCAutoStringRefAsUTF16String t_utf16_string;
525+ if (!t_utf16_string.Lock (*t_string))
526+ {
527+ return false ;
528+ }
529+
530+ return nil != (r_java_string = env->NewString (t_utf16_string.Ptr (), t_utf16_string.Size ()));
531+ }
532+
503533bool MCJavaStringFromUnicode (JNIEnv *env, const MCString *p_string, jstring &r_java_string)
504534{
505535 if (p_string == nil)
@@ -1403,6 +1433,8 @@ static MCJavaType native_sigchar_to_returntype(char p_sigchar)
14031433 return kMCJavaTypeVoid ;
14041434 case ' s' :
14051435 return kMCJavaTypeCString ;
1436+ case ' t' :
1437+ return kMCJavaTypeUtf8CString ;
14061438 case ' S' :
14071439 return kMCJavaTypeMCString ;
14081440 case ' U' :
@@ -1448,6 +1480,7 @@ static const char *return_type_to_java_sig(MCJavaType p_type)
14481480 case kMCJavaTypeBoolean : // boolean
14491481 return " Z" ;
14501482 case kMCJavaTypeCString : // string from char *
1483+ case kMCJavaTypeUtf8CString : // string from utf8 char *
14511484 case kMCJavaTypeMCString : // string from MCString *
14521485 case kMCJavaTypeMCStringUnicode : // string from utf16 MCString *
14531486 case kMCJavaTypeMCStringRef : // string from MCStringRef
@@ -1701,11 +1734,23 @@ bool MCJavaConvertParameters(JNIEnv *env, const char *p_signature, va_list p_arg
17011734 case kMCJavaTypeCString :
17021735 {
17031736 t_cstring = va_arg (p_args, const char *);
1704-
1737+
17051738 t_success = MCJavaStringFromNative (env, t_cstring, t_java_string);
17061739 if (t_success)
17071740 t_value . l = t_java_string;
17081741
1742+ t_delete = true ;
1743+ t_object = true ;
1744+ }
1745+ break ;
1746+ case kMCJavaTypeUtf8CString :
1747+ {
1748+ t_cstring = va_arg (p_args, const char *);
1749+
1750+ t_success = MCJavaStringFromUTF8 (env, t_cstring, t_java_string);
1751+ if (t_success)
1752+ t_value . l = t_java_string;
1753+
17091754 t_delete = true ;
17101755 t_object = true ;
17111756 }
0 commit comments