这也就是说,Java Activity层的用户自定义默认字体通过标准framework/JNI的途径是无法传递应用到Chromium内核的。
本来的基本想法是:通过Typeface.DEFAULT获得Java层的系统当前默认字体设置,通过Java动态反射调用获得native_instance句柄,然后尝试用JNI C++代码获得SkTypeface*指针,调用SkTypeface::serialize序列化到一个临时字体文件,然后将此路径回传Java,再重新传到Chromium内核代码。
帖2段核心demo代码:
AwSettings.java:
//#if ENABLE_USER_OVERRIDES_FONTFALLBACK
//hacker techniques to get current system's default typeface and apply it to chromium/skia kernel code:
@CalledByNative
private static long getDefaultTypefaceNativePointer() {
try{
android.graphics.Typeface defaultTypeface = android.graphics.Typeface.DEFAULT;
java.lang.reflect.Field field = null;
field = android.graphics.Typeface.class.getDeclaredField("native_instance");
long ret = 0;
if (android.os.Build.VERSION.SDK_INT>=21) {
//5.0+
ret = field.getLong(defaultTypeface);
}els

这篇博客探讨了尝试通过Java的Typeface.DEFAULT获取系统默认字体,并通过JNI传递到Chromium内核的失败过程。作者试图使用反射和JNI来获取SkTypeface*指针并进行序列化,但未能成功。
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



