- 调查3G页面的meta属性:initial-scale
从内核解析出该值 (JNI层)->内核java层 ,从而设置webview的Scale的大小。
1. 内核解析initial-scale
Settings::setMetadataSettings(const String& key, const String& value)
//设置m_viewport_initial_scale为指定值。
2. Jni层 接口函数:SetViewportSettingsFromNative
env->SetIntField(obj, gWebViewCoreFields.m_viewportInitialScale, s->viewportInitialScale())
//设置m_viewport_initial_scale -> gWebViewCoreFields.m_viewportInitialScale 里。
// Field ids for WebViewCore
struct WebViewCoreFields {
jfieldID m_nativeClass;
jfieldID m_viewportWidth;
jfieldID m_viewportHeight;
jfieldID m_viewportInitialScale;
jfieldID m_viewportMinimumScale;
jfieldID m_viewportMaximumScale;
jfieldID m_viewportUserScalable;
jfieldID m_viewportDensityDpi;
jfieldID m_webView;
} gWebViewCoreFields;
3. 通过 SetViewportSettingsFromNative()将解析出来的值m_viewport_initial_scale 传递给内核java层 :
webviewcore::mViewportInitialScale @ webviewcore.java
Q1:内核怎么样将解析出来的值m_viewport_initial_scale 与 内核java层 webviewcore::mViewportInitialScale值 对应的呢?
Answer: 通过webviewcore: register_webviewcore(JNIEnv* env) 它将java层与内核层的两个值对应,也实现了JNI定义函数,并将这个函数注册到Java层,以便于调用。
如:gWebViewCoreFields.m_viewportInitialScale = env->GetFieldID(widget, "mViewportInitialScale", "I");
如:jniRegisterNativeMethods(JNIEnv* env, const char* className,
const JNINativeMethod* gMethods, int numMethods)
{
4. 在内核java层调用 setViewportSettingsFromNative() @ didFirstLayout() in webviewcore.java
调用后,值就可以从内核传递到 java层。