ReviewOS

also looking at this

craft-native/craft

fix(android): text going to the JVM is modified UTF-8, and was not being

#168
Merged chris wants to merge fix/android-modified-utf8 into main
12 files +326 -136
packages/zig/src/bridge_android_db.zigmodified+3-10
Changes to packages/zig/src/bridge_android_db.zig
@@ -136,7 +136,7 @@ pub fn execute(j: Jni, allocator: std.mem.Allocator, db: jobject, sql: []const u
136136 try j.callVoidMethodA(
137137 db,
138138 try j.methodId(db_cls, "execSQL", "(Ljava/lang/String;[Ljava/lang/Object;)V"),
139 &.{ .{ .l = try javaString(j, allocator, sql) }, .{ .l = bind } },
139 &.{ .{ .l = try j.newStringUtf8(allocator, sql) }, .{ .l = bind } },
140140 );
141141}
142142
@@ -161,7 +161,7 @@ pub fn query(
161161 "rawQuery",
162162 "(Ljava/lang/String;[Ljava/lang/String;)Landroid/database/Cursor;",
163163 ),
164 &.{ .{ .l = try javaString(j, allocator, sql) }, .{ .l = bind } },
164 &.{ .{ .l = try j.newStringUtf8(allocator, sql) }, .{ .l = bind } },
165165 );
166166
167167 try out.append(allocator, '[');
@@ -212,20 +212,13 @@ pub fn query(
212212 }
213213}
214214
215fn javaString(j: Jni, allocator: std.mem.Allocator, text: []const u8) !jni.jstring {
216 const terminated = try allocator.allocSentinel(u8, text.len, 0);
217 defer allocator.free(terminated);
218 @memcpy(terminated, text);
219 return j.newStringUtf(terminated.ptr);
220}
221
222215fn stringArray(j: Jni, allocator: std.mem.Allocator, values: []const []const u8) !jobject {
223216 const string_cls = try j.findClass("java/lang/String");
224217 const array = try j.newObjectArray(values.len, string_cls);
225218 for (values, 0..) |value, i| {
226219 try j.pushLocalFrame(4);
227220 defer _ = j.popLocalFrame(null);
228 try j.setObjectArrayElement(array, i, try javaString(j, allocator, value));
221 try j.setObjectArrayElement(array, i, try j.newStringUtf8(allocator, value));
229222 }
230223 return array;
231224}