集成X5WebView内核主要是为了解决Android自带的WebView各种报错问题
研究了好几天,尝试过网上静态集成等等方法,没有一个正常的
后来在腾讯官方下载X5WebView最新SDK 2021-02-25的版本,但是官方Demo项目太老了,编译各种错误,无奈研究好久总算有点眉目,先说明下环境:
Android Studio 4.1.3
Visual studio 2019
Java 1.8
SDK Android API 28
NDK android-ndk-r21e
Cocos2d-x 3.17.2
腾讯浏览服务SDK,官方下载地址:https://x5.tencent.com/tbs/sdk.html
Cocos2d-x集成X5WebView分为两种
先说第一种:类集成,使用Activity来启动X5WebView
步骤1:
创建cocos2d-x项目
先创建一个cocos2d-x 3.17.2项目
使用Android studio 打开项目,同步可能报错,先把项目的插件版本和Gradle版本改为
3.5.3 对应Gradle版本 5.4.1
再设置NDK
设置完成以后项目会自动重新同步,若没有自动同步,请点击界面右上角的同步按钮同步项目
如图:
当项目显示可运行的时候,表示同步完成,项目可进行编译了
步骤2:
下载X5 SDK 引入jar包
https://x5.tencent.com/tbs/sdk.html
下载好后解压如图:
将tbs_sdk_thirdapp_v4.3.0.93_43993_sharewithdownloadwithfile_withoutGame_obfs_20210220_114728.jar复制到项目proj.android\app\libs目录下,没有libs文件夹自己创建
再打开Android studio界面,切换到Project样式
选择SDK文件右键Add As Library
直接确定,项目会自动同步完成
步骤3:
添加权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
Application节点添加 android:usesCleartextTraffic=“true”
解决高版本不能访问http问题,添加完成后如下:
步骤4:
参照官方Demo写一个继承WebView的类
创建名为X5WebView的类,代码如下:
package org.cocos2dx.cpp;
import android.annotation.SuppressLint;
import android.content.Context;
import android.util.AttributeSet;
import com.tencent.smtt.sdk.WebSettings;
import com.tencent.smtt.sdk.WebView;
import com.tencent.smtt.sdk.WebViewClient;
public class X5WebView extends WebView
{
//防止加载网页时调起系统浏览器
private WebViewClient client = new WebViewClient() {
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
};
//重写构造函数
@SuppressLint("SetJavaScriptEnabled")
public X5WebView(Context context, AttributeSet attributeSet) {
super(context, attributeSet);
this.setWebViewClient(client);
WebSettings webSetting = this.getSettings();
webSetting.setJavaScriptEnabled(true);
webSetting.setJavaScriptCanOpenWindowsAutomatically(true);
webSetting.setAllowFileAccess(true);
webSetting.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);
webSetting.setSupportZoom(true);
webSetting.setBuiltInZoomControls(true);
webSetting.setUseWideViewPort(true);
webSetting.setSupportMultipleWindows(false);
webSetting.setAppCacheEnabled(true);
webSetting.setDomStorageEnabled(true);
webSetting.setGeolocationEnabled(true);
webSetting.setAppCacheMaxSize(Long.MAX_VALUE);
webSetting.setPluginState(WebSettings.PluginState.ON_DEMAND);
webSetting.setCacheMode(WebSettings.LOAD_NO_CACHE);
this.getView().setClickable(true);
}
//重写构造函数
public X5WebView(Context context) {
super(context);
this.setBackgroundColor(85621);
}
}
实现WebViewJavaScriptFunction接口,好像调用JS要
代码如下:
package org.cocos2dx.cpp;
public interface WebViewJavaScriptFunction {
void onJsFunctionCalled(String tag);
}
步骤5:
在 AppActivity 类中添加一个全局变量,用来记录内核初始化状态
再添加X5内核初始化代码
public static boolean mX5WebViewInitState = false; //用于记录内核是否初始化完成
package org.cocos2dx.cpp;
import android.os.Bundle;
import org.cocos2dx.lib.Cocos2dxActivity;
import android.os.Build;
import android.util.Log;
import android.view.WindowManager;
import com.tencent.smtt.sdk.QbSdk;
public class