这也就是说,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>