WebCoreFrameBridge.cpp

BrowserFrame通过jni传下来的调用都会调用到WebCoreFrameBridge.cpp中的对应函数中,其他webkit的模块想回调信息给BrowserFrame则要通过WebFrame类。主要使用WebFrame类的是WebCoreSupport/目录下的WebUrlLoadClient,ChromeClientAndroid,FrameLoaderClientAndroid。这三个类都保存了WebFrame的指针作为成员变量,而在jni目录下还有些类用到WebFrame,但只是在某个功能中用到,并没有把它作为成员。

BrowserFrame.java的正向与反向的jni调用

在WebCoreFrameBridge.cpp中提供的JNI函数中,主要提供了对WebCore::Frame的调用,即BrowserFrame通过jni调用到c层的WebCoreFrameBridge.cpp中的函数,在WebCoreFrameBridge.cpp中可以找到对应的WebCore::Frame,并执行WebCore::Frame的操作,或者通过WebCore::Frame找到WebCore::Frame中的成员,调用WebCore::Frame中成员的操作。

典型的例子如:

Java层执行前进或后退时,会调用BrowserFrame::goBackOrForward,该函数中会调用jni函数nativeGoBackOrForward,该jni函数对应c层的WebCoreFrameBridge.cpp中的GoBackOrForward。GoBackOrForward会找到对应的WebCore::Frame,然后调用pFrame->page()->goBack()之类的函数。

对于回调给java层BrameFrame,是通过WebFrame的函数,反向调用jni,来回调到java层的BrowserFrame的。

典型的例子如:

当需要向java层回调加载进度信息时,首先在WebKit平台相关层的WebCoreSupport/的FrameLoaderClientAndroid::postProgressEstimateChangedNotification(),在FrameLoaderClientAndroid中存有WebFrame的成员变量,所以这里通过成员WebFrame调用它的WebFrame::setProgress(),在WebFrame::setProgress()中通过jni反向调用,调用到java层BrowserFrame::setProgress。这样就完成了整个回调的过程。

CreateFrame

WebCoreFrameBridge.cpp中很重要的一个函数就是CreateFrame。这个函数在java层的BrowserFrame的构造函数中通过jni调用的。

在CreateFrame中会创建很多对象,这些对象的关系比较复杂。

下图为CreateFrame中创建的几个主要的类对象。

首先要明确,这个CreateFrame是在BrowserFrame构造时被创建的,而BrowserFrame又是同WebView一同创建的,即每个WebView有唯一的一个BrowserFrame对应。

这样可见上述的这些类对象,都是跟一个WebView对应的。

对于WebCore中的类的概念:

WebCore::Page

一个Page对应浏览器的一个Tab页,也即对应一个WebView,就是说一个Page对应一个Tab下的完整的html网页

所以Page是个比较大的总体的概念.

它包括对这个页面的设置Settings,它的窗口类Chrome,加载的进度信息ProgressTracker,前进后退的管理控制BackForwardController,渲染的主题RenderTheme,主Frame。

Settings:

一个页面的设置。Java层的WebSettings通过jni与c层的WebSettings关联,在执行同步设置时,就会在c层的WebSettings中使用java层的设置项来配置Page中的WebCore::Settings成员。这样完成java层WebView的WebSettings与c层WebKit的WebCore::Settings的同步。

Chrome:

这个还不是很清楚,貌似是WebCore的角度看来是页面窗口相关的内容,提供窗口,控件等行为的类。在WebCore::Chrome中有接口类成员WebCore::ChromeClient实际实现为ChromeClientAndroid子类,用于实现平台相关的回调部分。ChromeClientAndroid是在WebCoreSupport/目录下的,它又可以通过找到WebFrame来实现与上层jni的回调。

ProgressTracker:

维护了Page中接收数据的数量和进度等信息。回调时主要通过Frame->FrameLoader-> FrameLoaderClient执行回调,这个就是FrameLoaderClientAndroid,定义在WebCoreSupport/目录下,它又可以通过找到WebFrame来实现与上层jni的回调。

WebCore::BackForwardController:

维护了前进与后退的操作

RenderTheme:

定义了很多默认样式属性,作为一些默认的CSS的样式,比如一些控件的颜色值等。

Frame:

Page中只有一个Frame就是m_mainFrame,是这个Page的主体数据内容。

WebCore::Frame

一个Frame对应一棵DOM树。一个html网页还可以有子Frame用iFrame来标识的,就像猫扑那样的页面,这样一个Page下就可以有多个Frame。但是Page中只有一个Frame就是mainFrame。其他的Frame是由Frame结构中的FrameTree结构来组建。

另外一个Frame有一个FrameLoader,在构造时一并创建,用于加载html网页及其资源用。

由下图可见,Frame针对一个网页的加载(FrameLoader),显示(FrameView),DOM树(Document),控制(ScriptController,Editor,SelectionController,EventHandler等)

Jni/WebViewCore

对应于java层的WebViewCore,java层主要传递了一些事件,如click事件,以及对控件的一些回调,比如SendListBoxChoices。

可以看到,这些是跟某个页面(即BrowserFrame)无关的,是系统的一些事件,这些会直接在java层的WebViewCore中直接通过native方法调用到c层的。之前的Framework架构的介绍中可以看到,很多情况下都是app层发消息给WebViewCore线程,然后WebViewCore中又通过其BrowserFrame成员来调用BrowserFrame的native方法。该流程是针对跟某个Frame相关的一些操作,如果是跟Frame不直接相关的,则会通过WebViewCore自身的native方法,直接调用到c层的jni/WebViewCore中。

主要的JNI类:

Webkit JNI的更多相关文章

  1. [Android Webkit]JNI基础及Java层与C++层的交互

    1. JNI 注册 1.1. JNI的基础结构       JAVA == JNI == Native Code      JNI(Java Native Interface)是Java与Native ...

  2. XE7 Unit scope names

    今天编译RM报表 7.0 for XE7 ,build设计时包,提示 {$IFDEF JPEG}, JPEG{$ENDIF} 没有找到 JPEG.DCU,这个应该是XE7自带. 后来 在项目选项里,编 ...

  3. android4.2 webkit 中的jni

    在android 应用开发中使用WebView,当一个webveiw 被创建时, 也会去load 他所对应的动态库,这里动态库也就是传说中的webkit 内核等. C++ 层与java 层的交互也是通 ...

  4. webkit事件处理

    1,概述 原文地址:http://blog.csdn.net/awebkit/article/details/8493716 浏览器处理事件一般有两个过程,捕获过程和冒泡过程,这是由addEventL ...

  5. webkit模块介绍

    一.Webkit模块   用到的第三方库如下:   cairo 一个2D绘图库 casqt Unicode处理用的库,从QT中抽取部分代码形成的 expat 一个XML SAX解析器的库 freety ...

  6. Android webkit 事件传递流程详解

    前言:基于android webview 上定制自己使用的可移植浏览器apk,遇到好多按键处理的问题.所以索性研究了一下keyevent 事件的传递流程. frameworks 层 keyevent ...

  7. JNI总结(一)

    JNI 是 Java平台中的一个强大特性.应用程序能够通过 JNI把 C/C++代码集成进 Java程序中.通过 JNI.开发人员在利用 Java平台强大功能的同一时候,又不必放弃对原有代码的投资.由 ...

  8. 在ubuntu12.04下编译android4.1.2添加JNI层出现问题

    tiny4412学习者,在ubuntu12.04下编译android4.1.2添加JNI层出现问题: (虚心请教解决方法) trouble writing output: Too many metho ...

  9. Android JNI开发提高篇

    有关JNI的开发技术,我们继续围绕Android平台进行,JNI可以支持C或C++,从目前为止我们写过的JNI代码均为C实现的,即文件名为.C而C++的和这些有什么不同呢? Android平台上的JN ...

随机推荐

  1. 【CCF】网络延时 树搜索

    #include<iostream> #include<cstdio> #include<string> #include<cstring> #incl ...

  2. 爬虫【自动登陆github和抽屉】

    自动登陆github用户详情页 代码 #! /usr/bin/env python # -*- coding: utf- -*- # __author__ = "wuxiaoyu" ...

  3. Ubuntu 16.04 LTS 成功编译 Android 6.0 源码教程

    sudo apt-get install -y git flex bison gperf build-essential libncurses5-dev:i386 \  libx11-dev:i386 ...

  4. 使用vue-cli搭建element-ui项目

    最近在使用element-ui搭建项目时发现若只纯用webpack来运行element-ui,要配置各种文件,对于新手来说实在太不友好了, 就想到用vue-cli来搭建整个vue项目 1.安装node ...

  5. vue v-on:click传递动态参数

    最近项目中要为一个循环列表动态传送当前点击列的数据,查了很久资料也没有一个完美的解决方案, 新手只能用vue的事件处理器与jquery的选择器做了一个不伦不类的方案,居然也能解决这个问题,作此记录留待 ...

  6. Codechef Eugene and big number(矩阵快速幂)

    题目链接 Eugene and big number 题目转化为 $f(n) = m * f(n - 1) + a$ $f(n + 1) = m * f(n) + a$ 两式相减得 $f(n + 1) ...

  7. jar word 模板操作比较好用的工具

    个人觉得比较好用的java word 模板 http://deepoove.com/poi-tl/

  8. 3.eclipse中 maven打包web工程几种方式

    1.右键项目-export 选择war file导出即可 2.第二种:右键项目-RUN AS -maven build..goals填入:clean package 第三种方式:右键项目.选择Debu ...

  9. electron入门教程

    1.atom/electron github: https://github.com/atom/electron 中文文档: https://github.com/atom/electron/tree ...

  10. vbox在共享文件夹设置链接报错Protocol error问题

    环境: 基于VBox 的 vagrant (centos版本)开发环境. 问题: Virtualbox 虚拟机(centOS)中,在进行go程序编译的时候,需要设置一个链接符,然后得到了如下的错误: ...