Skip to content
This repository was archived by the owner on Aug 31, 2021. It is now read-only.

Commit b13b430

Browse files
[[ ExternalsV6 ]] Fix Java issues
1 parent 599a390 commit b13b430

File tree

3 files changed

+54
-29
lines changed

3 files changed

+54
-29
lines changed

engine/src/externalv1.cpp

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -428,7 +428,7 @@ class MCExternalVariable
428428
// SN-2014-07-01: [[ ExternalsApiV6 ]] Default string in use is now a StringRef
429429
// New function added to get the CData - allowing nil bytes in the string
430430
MCExternalError GetString(MCExternalValueOptions options, MCStringRef& r_string);
431-
MCExternalError GetCData(MCExternalValueOptions options, MCString r_data);
431+
MCExternalError GetCData(MCExternalValueOptions options, void* r_data);
432432
MCExternalError GetCString(MCExternalValueOptions options, const char*& r_cstring);
433433

434434
virtual bool IsTemporary(void) = 0;
@@ -1152,10 +1152,11 @@ MCExternalError MCExternalVariable::GetString(MCExternalValueOptions p_options,
11521152
}
11531153

11541154
// SN-2014-07-16: [[ ExternalsApiV6 ]] Function to get the CData type - allowing nil bytes in the string
1155-
MCExternalError MCExternalVariable::GetCData(MCExternalValueOptions p_options, MCString r_data)
1155+
MCExternalError MCExternalVariable::GetCData(MCExternalValueOptions p_options, void *r_value)
11561156
{
11571157
MCAutoStringRef t_string_value;
11581158
MCExternalError t_error;
1159+
MCString t_string;
11591160
uindex_t t_length;
11601161

11611162
t_error = GetString(p_options, &t_string_value);
@@ -1168,7 +1169,8 @@ MCExternalError MCExternalVariable::GetCData(MCExternalValueOptions p_options, M
11681169
if (!MCStringConvertToNative(*t_string_value, (char_t*&)m_string_conversion, t_length))
11691170
return kMCExternalErrorOutOfMemory;
11701171

1171-
r_data . set(m_string_conversion, t_length);
1172+
t_string . set(m_string_conversion, t_length);
1173+
*(MCString*)r_value = t_string;
11721174
return kMCExternalErrorNone;
11731175
}
11741176

@@ -1781,6 +1783,7 @@ static MCExternalError MCExternalVariableStore(MCExternalVariableRef var, MCExte
17811783
MCAutoStringRef t_stringref;
17821784
MCString* t_string;
17831785
t_string = (MCString*)p_value;
1786+
17841787
if (!MCStringCreateWithBytes((byte_t*)t_string->getstring(), t_string->getlength(), kMCStringEncodingUTF8, false, &t_stringref))
17851788
return kMCExternalErrorOutOfMemory;
17861789

@@ -1810,13 +1813,16 @@ static MCExternalError MCExternalVariableStore(MCExternalVariableRef var, MCExte
18101813
case kMCExternalValueOptionAsUTF16CString:
18111814
{
18121815
MCAutoStringRef t_stringref;
1813-
unichar_t *t_chars;
1816+
uint16_t *t_chars;
18141817
uindex_t t_char_count;
18151818

1816-
t_chars = *(unichar_t**)p_value;
1817-
for (t_char_count = 0 ; *t_chars; ++t_char_count)
1819+
t_chars = *(uint16_t**)p_value;
1820+
1821+
for (t_char_count = 0 ; *t_chars != 0; ++t_char_count)
18181822
++t_chars;
18191823

1824+
MCLog("char found: %d", t_char_count);
1825+
MCLog("Pointer: %p", p_value);
18201826

18211827
if (!MCStringCreateWithChars(*(const unichar_t**)p_value, t_char_count, &t_stringref))
18221828
return kMCExternalErrorOutOfMemory;
@@ -1939,7 +1945,7 @@ static MCExternalError MCExternalVariableFetch(MCExternalVariableRef var, MCExte
19391945
case kMCExternalValueOptionAsReal:
19401946
return var -> GetReal(p_options, *(real64_t *)p_value);
19411947
case kMCExternalValueOptionAsString:
1942-
return var -> GetCData(p_options, *(MCString*)p_value);
1948+
return var -> GetCData(p_options, p_value);
19431949
case kMCExternalValueOptionAsCString:
19441950
return var -> GetCString(p_options, *(const char **)p_value);
19451951

lcidlc/src/Support.mm

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3200,7 +3200,6 @@ static LCError java_from__utf16cstring(JNIEnv *env, const char* p_value, jobject
32003200
while(*t_unichar_value++ != 0)
32013201
++t_char_count;
32023202

3203-
32043203
jobject t_java_value;
32053204
if (err == kLCErrorNone)
32063205
{
@@ -3269,7 +3268,6 @@ static bool fetch__java_string(JNIEnv *env, const char *arg, MCVariableRef var,
32693268

32703269
return fetch__report_error(err, arg);
32713270
}
3272-
32733271

32743272
static bool fetch__java_cstring(JNIEnv *env, const char *arg, MCVariableRef var, jobject& r_value)
32753273
{
@@ -3338,7 +3336,6 @@ static bool fetch__java_data(JNIEnv *env, const char *arg, MCVariableRef var, in
33383336

33393337
if (err == kLCErrorNone)
33403338
{
3341-
33423339
t_java_value = (jobject)env -> NewByteArray(t_data_length);
33433340
if (t_java_value == nil || env -> ExceptionOccurred() != nil)
33443341
{
@@ -3513,6 +3510,7 @@ static LCError java_to__utf8cstring(JNIEnv *env, jobject value, char*& r_cstring
35133510
else
35143511
t_utf8_chars[utf8_index++] = t_cesu8_chars[cesu8_index++];
35153512
}
3513+
t_utf8_chars[t_utf8_char_count] = '\0';
35163514
}
35173515

35183516
if (err == kLCErrorNone)
@@ -3554,9 +3552,18 @@ static LCError java_to__utf16cstring(JNIEnv *env, jobject value, char*& r_cstrin
35543552
t_terminated_unichars = (jchar *)malloc((t_unichar_count + 1) * sizeof(jchar));
35553553

35563554
if (t_terminated_unichars == nil)
3555+
{
3556+
__android_log_write(ANDROID_LOG_INFO, "revandroid", "NULL pointer");
35573557
err = kLCErrorOutOfMemory;
3558+
}
35583559
else
3560+
{
3561+
char t[123];
3562+
sprintf(t, "pointer sent: %p", t_terminated_unichars);
3563+
__android_log_write(ANDROID_LOG_INFO, "revandroid", t);
35593564
memcpy(t_terminated_unichars, t_unichars, (t_unichar_count + 1) * sizeof(jchar));
3565+
t_terminated_unichars[t_unichar_count] = '\0';
3566+
}
35603567
}
35613568

35623569
if (err == kLCErrorNone)
@@ -3647,7 +3654,7 @@ static bool store__java_data(JNIEnv *env, MCVariableRef var, int p_value_as, job
36473654
// SN-2014-07-17: [[ ExternalsApiV6 ]] UTF-16 data carry the char count, not the byte length
36483655
if (p_value_as == kLCValueOptionAsUTF16CData)
36493656
t_native_value . length /= 2;
3650-
err = LCValueStore(var, kLCValueOptionAsCData, &t_native_value);
3657+
err = LCValueStore(var, p_value_as, &t_native_value);
36513658
}
36523659

36533660
if (t_native_value . buffer != nil)

revtestexternal/src/revtestexternal.java

Lines changed: 30 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -109,17 +109,22 @@ public void onCancel(DialogInterface p_dialog)
109109
t_wait . Release();
110110
}
111111

112-
private static String trebleClef()
112+
private static byte[] utf8TrebleKey()
113113
{
114114
byte[] t_utf8_clef = new byte[4];
115115
t_utf8_clef[0] = Integer.decode("0xF0").byteValue();
116116
t_utf8_clef[1] = Integer.decode("0x9D").byteValue();
117117
t_utf8_clef[2] = Integer.decode("0x84").byteValue();
118118
t_utf8_clef[3] = Integer.decode("0x9E").byteValue();
119119

120+
return t_utf8_clef;
121+
}
122+
123+
private static String trebleClef()
124+
{
120125
try
121126
{
122-
return new String(t_utf8_clef, "UTF8");
127+
return new String(utf8TrebleKey(), "UTF8");
123128
}
124129
catch(UnsupportedEncodingException e)
125130
{
@@ -129,43 +134,50 @@ private static String trebleClef()
129134

130135
public static String revTestExternalTestNativeString(String p_string)
131136
{
132-
// String t_string = new String();
133-
// return t_string . concat(trebleClef()) . concat(p_string) . concat(trebleClef());
134-
return p_string;
137+
String t_string = new String();
138+
return t_string . concat(p_string) . concat(p_string);
135139
}
136140

137141
public static String revTestExternalTestUTF8String(String p_string)
138142
{
139143
String t_string = new String();
140-
return t_string . concat(trebleClef()) . concat(p_string) . concat(trebleClef());
144+
return t_string . concat(p_string) . concat(p_string);
141145
}
142146

143147
public static String revTestExternalTestUTF16String(String p_string)
144148
{
145-
// String t_string = new String();
146-
// return t_string . concat(trebleClef()) . concat(p_string) . concat(trebleClef());
147-
return p_string;
149+
String t_string = new String();
150+
return t_string . concat(p_string) . concat(p_string);
148151
}
149152

150153
public static byte[] revTestExternalTestNativeData(byte[] p_string)
151154
{
152-
// String t_string = new String();
153-
// return t_string . concat(trebleClef()) . concat(p_string) . concat(trebleClef());
154-
return p_string;
155+
byte[] t_bytes = new byte[p_string.length * 2];
156+
157+
System.arraycopy(p_string, 0, t_bytes, 0, p_string.length);
158+
System.arraycopy(p_string, 0, t_bytes, p_string .length, p_string .length);
159+
160+
return t_bytes;
155161
}
156162

157163
public static byte[] revTestExternalTestUTF8Data(byte[] p_string)
158164
{
159-
// String t_string = new String();
160-
// return t_string . concat(trebleClef()) . concat(p_string) . concat(trebleClef());
161-
return p_string;
165+
byte[] t_bytes = new byte[p_string.length * 2];
166+
167+
System.arraycopy(p_string, 0, t_bytes, 0, p_string.length);
168+
System.arraycopy(p_string, 0, t_bytes, p_string .length, p_string .length);
169+
170+
return t_bytes;
162171
}
163172

164173
public static byte[] revTestExternalTestUTF16Data(byte[] p_string)
165174
{
166-
// String t_string = new String();
167-
// return t_string . concat(trebleClef()) . concat(p_string) . concat(trebleClef());
168-
return p_string;
175+
byte[] t_bytes = new byte[p_string.length * 2];
176+
177+
System.arraycopy(p_string, 0, t_bytes, 0, p_string.length);
178+
System.arraycopy(p_string, 0, t_bytes, p_string .length, p_string .length);
179+
180+
return t_bytes;
169181
}
170182

171183
public static void revTestExternalTestPostAndSend()

0 commit comments

Comments
 (0)