diff --git a/libs/hwui/hwui/MinikinUtils.cpp b/libs/hwui/hwui/MinikinUtils.cpp
index e359145..b802908 100644
--- a/libs/hwui/hwui/MinikinUtils.cpp
+++ b/libs/hwui/hwui/MinikinUtils.cpp
@@ -95,16 +95,6 @@
                                         endHyphen, advances);
 }
 
-minikin::MinikinExtent MinikinUtils::getFontExtent(const Paint* paint, minikin::Bidi bidiFlags,
-                                                   const Typeface* typeface, const uint16_t* buf,
-                                                   size_t start, size_t count, size_t bufSize) {
-    minikin::MinikinPaint minikinPaint = prepareMinikinPaint(paint, typeface);
-    const minikin::U16StringPiece textBuf(buf, bufSize);
-    const minikin::Range range(start, start + count);
-
-    return minikin::getFontExtent(textBuf, range, bidiFlags, minikinPaint);
-}
-
 bool MinikinUtils::hasVariationSelector(const Typeface* typeface, uint32_t codepoint, uint32_t vs) {
     const Typeface* resolvedFace = Typeface::resolveDefault(typeface);
     return resolvedFace->fFontCollection->hasVariationSelector(codepoint, vs);
diff --git a/libs/hwui/hwui/MinikinUtils.h b/libs/hwui/hwui/MinikinUtils.h
index 009b84b..a15803a 100644
--- a/libs/hwui/hwui/MinikinUtils.h
+++ b/libs/hwui/hwui/MinikinUtils.h
@@ -56,10 +56,6 @@
                                          size_t start, size_t count, size_t bufSize,
                                          float* advances);
 
-    static minikin::MinikinExtent getFontExtent(const Paint* paint, minikin::Bidi bidiFlags,
-                                                const Typeface* typeface, const uint16_t* buf,
-                                                size_t start, size_t count, size_t bufSize);
-
     static bool hasVariationSelector(const Typeface* typeface, uint32_t codepoint,
                                                  uint32_t vs);
 
diff --git a/libs/hwui/jni/Paint.cpp b/libs/hwui/jni/Paint.cpp
index f768632..22a1e1f 100644
--- a/libs/hwui/jni/Paint.cpp
+++ b/libs/hwui/jni/Paint.cpp
@@ -541,6 +541,26 @@
         return result;
     }
 
+    // ------------------ @FastNative ---------------------------
+
+    static jint setTextLocales(JNIEnv* env, jobject clazz, jlong objHandle, jstring locales) {
+        Paint* obj = reinterpret_cast<Paint*>(objHandle);
+        ScopedUtfChars localesChars(env, locales);
+        jint minikinLocaleListId = minikin::registerLocaleList(localesChars.c_str());
+        obj->setMinikinLocaleListId(minikinLocaleListId);
+        return minikinLocaleListId;
+    }
+
+    static void setFontFeatureSettings(JNIEnv* env, jobject clazz, jlong paintHandle, jstring settings) {
+        Paint* paint = reinterpret_cast<Paint*>(paintHandle);
+        if (!settings) {
+            paint->setFontFeatureSettings(std::string());
+        } else {
+            ScopedUtfChars settingsChars(env, settings);
+            paint->setFontFeatureSettings(std::string(settingsChars.c_str(), settingsChars.size()));
+        }
+    }
+
     static SkScalar getMetricsInternal(jlong paintHandle, SkFontMetrics *metrics) {
         const int kElegantTop = 2500;
         const int kElegantBottom = -1000;
@@ -573,67 +593,6 @@
         return spacing;
     }
 
-    static void doFontExtent(JNIEnv* env, jlong paintHandle, const jchar buf[], jint start,
-                             jint count, jint bufSize, jboolean isRtl, jobject fmi) {
-        const Paint* paint = reinterpret_cast<Paint*>(paintHandle);
-        const Typeface* typeface = paint->getAndroidTypeface();
-        minikin::Bidi bidiFlags = isRtl ? minikin::Bidi::FORCE_RTL : minikin::Bidi::FORCE_LTR;
-        minikin::MinikinExtent extent =
-                MinikinUtils::getFontExtent(paint, bidiFlags, typeface, buf, start, count, bufSize);
-
-        SkFontMetrics metrics;
-        getMetricsInternal(paintHandle, &metrics);
-
-        metrics.fAscent = extent.ascent;
-        metrics.fDescent = extent.descent;
-
-        // If top/bottom is narrower than ascent/descent, adjust top/bottom to ascent/descent.
-        metrics.fTop = std::min(metrics.fAscent, metrics.fTop);
-        metrics.fBottom = std::max(metrics.fDescent, metrics.fBottom);
-
-        GraphicsJNI::set_metrics_int(env, fmi, metrics);
-    }
-
-    static void getFontMetricsIntForText___C(JNIEnv* env, jclass, jlong paintHandle,
-                                             jcharArray text, jint start, jint count, jint ctxStart,
-                                             jint ctxCount, jboolean isRtl, jobject fmi) {
-        ScopedCharArrayRO textArray(env, text);
-
-        doFontExtent(env, paintHandle, textArray.get() + ctxStart, start - ctxStart, count,
-                     ctxCount, isRtl, fmi);
-    }
-
-    static void getFontMetricsIntForText___String(JNIEnv* env, jclass, jlong paintHandle,
-                                                  jstring text, jint start, jint count,
-                                                  jint ctxStart, jint ctxCount, jboolean isRtl,
-                                                  jobject fmi) {
-        ScopedStringChars textChars(env, text);
-
-        doFontExtent(env, paintHandle, textChars.get() + ctxStart, start - ctxStart, count,
-                     ctxCount, isRtl, fmi);
-    }
-
-    // ------------------ @FastNative ---------------------------
-
-    static jint setTextLocales(JNIEnv* env, jobject clazz, jlong objHandle, jstring locales) {
-        Paint* obj = reinterpret_cast<Paint*>(objHandle);
-        ScopedUtfChars localesChars(env, locales);
-        jint minikinLocaleListId = minikin::registerLocaleList(localesChars.c_str());
-        obj->setMinikinLocaleListId(minikinLocaleListId);
-        return minikinLocaleListId;
-    }
-
-    static void setFontFeatureSettings(JNIEnv* env, jobject clazz, jlong paintHandle,
-                                       jstring settings) {
-        Paint* paint = reinterpret_cast<Paint*>(paintHandle);
-        if (!settings) {
-            paint->setFontFeatureSettings(std::string());
-        } else {
-            ScopedUtfChars settingsChars(env, settings);
-            paint->setFontFeatureSettings(std::string(settingsChars.c_str(), settingsChars.size()));
-        }
-    }
-
     static jfloat getFontMetrics(JNIEnv* env, jobject, jlong paintHandle, jobject metricsObj) {
         SkFontMetrics metrics;
         SkScalar spacing = getMetricsInternal(paintHandle, &metrics);
@@ -1056,11 +1015,6 @@
     {"nGetRunAdvance", "(J[CIIIIZI)F", (void*) PaintGlue::getRunAdvance___CIIIIZI_F},
     {"nGetOffsetForAdvance", "(J[CIIIIZF)I",
             (void*) PaintGlue::getOffsetForAdvance___CIIIIZF_I},
-    {"nGetFontMetricsIntForText", "(J[CIIIIZLandroid/graphics/Paint$FontMetricsInt;)V",
-      (void*)PaintGlue::getFontMetricsIntForText___C},
-    {"nGetFontMetricsIntForText",
-      "(JLjava/lang/String;IIIIZLandroid/graphics/Paint$FontMetricsInt;)V",
-      (void*)PaintGlue::getFontMetricsIntForText___String},
 
     // --------------- @FastNative ----------------------
 
@@ -1139,7 +1093,6 @@
     {"nEqualsForTextMeasurement", "(JJ)Z", (void*)PaintGlue::equalsForTextMeasurement},
 };
 
-
 int register_android_graphics_Paint(JNIEnv* env) {
     return RegisterMethodsOrDie(env, "android/graphics/Paint", methods, NELEM(methods));
 }
