Unverified Commit edb89083 authored by Pavel's avatar Pavel Committed by GitHub

Fix segfaults (#561)

* skString c_str contains string encoded in UTF8, but it was treated as UTF16

* ensure that managedString doesn't collect til the end of JNI call, also close manually at the end
parent 62ea4669
......@@ -105,8 +105,8 @@ class Shaper internal constructor(ptr: NativePointer) : Managed(ptr, _FinalizerH
fun shape(text: String, font: Font, opts: ShapingOptions, width: Float, offset: Point): TextBlob? {
return try {
Stats.onNativeCall()
val managedString = ManagedString(text)
val ptr = interopScope {
val ptr = ManagedString(text).use { managedString ->
interopScope {
_nShapeBlob(
_ptr,
managedString._ptr,
......@@ -119,6 +119,7 @@ class Shaper internal constructor(ptr: NativePointer) : Managed(ptr, _FinalizerH
offsetY = offset.y
)
}
}
if (NullPointer == ptr) null else TextBlob(ptr)
} finally {
reachabilityBarrier(this)
......
......@@ -227,7 +227,10 @@ extern "C" JNIEXPORT jshort JNICALL Java_org_jetbrains_skia_FontKt__1nGetUTF32Gl
extern "C" JNIEXPORT jint JNICALL Java_org_jetbrains_skia_FontKt__1nGetStringGlyphsCount
(JNIEnv* env, jclass jclass, jlong ptr, jstring str, jint len) {
SkFont* instance = reinterpret_cast<SkFont*>(static_cast<uintptr_t>(ptr));
return instance->countText(skString(env, str).c_str(), len * sizeof(jchar), SkTextEncoding::kUTF16);
const jchar* chars = env->GetStringCritical(str, nullptr);
jint result = instance->countText(chars, len * sizeof(jchar), SkTextEncoding::kUTF16);
env->ReleaseStringCritical(str, chars);
return result;
}
extern "C" JNIEXPORT void JNICALL Java_org_jetbrains_skia_FontKt__1nMeasureText
......@@ -246,7 +249,10 @@ extern "C" JNIEXPORT jfloat JNICALL Java_org_jetbrains_skia_FontKt__1nMeasureTex
(JNIEnv* env, jclass jclass, jlong ptr, jstring str, jint len, jlong paintPtr) {
SkFont* instance = reinterpret_cast<SkFont*>(static_cast<uintptr_t>(ptr));
SkPaint* paint = reinterpret_cast<SkPaint*>(static_cast<uintptr_t>(paintPtr));
return instance->measureText(skString(env, str).c_str(), len * sizeof(jchar), SkTextEncoding::kUTF16, nullptr, paint);
const jchar* chars = env->GetStringCritical(str, nullptr);
jfloat result = instance->measureText(chars, len * sizeof(jchar), SkTextEncoding::kUTF16, nullptr, paint);
env->ReleaseStringCritical(str, chars);
return result;
}
extern "C" JNIEXPORT void JNICALL Java_org_jetbrains_skia_FontKt__1nGetWidths
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment