Cocos2d-x3.3RC0载入Android的WebView
代码部分摘自http://www.fusijie.com/blog/2013/12/26/play-cocos2dx-33/
Cocos2d-x3.3RC0通过Jni嵌入Android的WebView空间,在Cocos2d-x中显示网页。直接上代码。
1、Java层代码
用ADT打开proj.android的project文件夹src文件夹下的org.cocos2dx.cpp文件夹下的AppActivity.java。加入例如以下代码:
- //AppActivity.java
- /****************************************************************************
- Copyright (c) 2008-2010 Ricardo Quesada
- Copyright (c) 2010-2012 cocos2d-x.org
- Copyright (c) 2011 Zynga Inc.
- Copyright (c) 2013-2014 Chukong Technologies Inc.
- http://www.cocos2d-x.org
- Permission is hereby granted, free of charge, to any person obtaining a copy
- of this software and associated documentation files (the "Software"), to deal
- in the Software without restriction, including without limitation the rights
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
- copies of the Software, and to permit persons to whom the Software is
- furnished to do so, subject to the following conditions:
- The above copyright notice and this permission notice shall be included in
- all copies or substantial portions of the Software.
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
- THE SOFTWARE.
- ****************************************************************************/
- package org.cocos2dx.cpp;
- import org.cocos2dx.lib.Cocos2dxActivity;
- import android.os.Bundle;
- import android.view.Gravity;
- import android.view.KeyEvent;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.webkit.WebView;
- import android.webkit.WebViewClient;
- import android.widget.Button;
- import android.widget.FrameLayout;
- import android.widget.ImageView;
- import android.widget.LinearLayout;
- import com.pactera.webview.R;
- public class AppActivity extends Cocos2dxActivity {
- static AppActivity test = null;//AppActivity实例
- WebView m_webView;//WebView控件
- ImageView m_imageView;//ImageView控件
- FrameLayout m_webLayout;//FrameLayout布局
- LinearLayout m_topLayout;//LinearLayout布局
- Button m_backButton;//返回关闭button
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- // TODO Auto-generated method stub
- super.onCreate(savedInstanceState);
- test = this;
- m_webLayout = new FrameLayout(this);//新建布局
- FrameLayout.LayoutParams lytp = new FrameLayout.LayoutParams(640,1000);//布局的尺寸
- lytp.gravity = Gravity.CENTER;//布局的Type
- addContentView(m_webLayout, lytp);//增加ContentView
- }
- //初始化activity
- public static AppActivity getInstance(){
- return test;
- }
- //显示webView
- public void openWebview(){
- this.runOnUiThread(new Runnable() {//在主线程里载入控件
- @Override
- public void run() {
- // TODO Auto-generated method stub
- //初始化webview
- m_webView = new WebView(test);
- //设置webview能够运行js脚本
- m_webView.getSettings().setJavaScriptEnabled(true);
- //设置缩放工具
- m_webView.getSettings().setSupportZoom(true);
- m_webView.getSettings().setBuiltInZoomControls(true);
- //载入URL
- m_webView.loadUrl("http://www.baidu.com/");
- //使页面获得焦点
- m_webView.requestFocus();
- //假设页面中有链接,使链接在当前的浏览器中响应
- m_webView.setWebViewClient(new WebViewClient(){
- @Override
- public boolean shouldOverrideUrlLoading(WebView view,
- String url) {
- // TODO Auto-generated method stub
- if(url.indexOf("tel:")<0){
- view.loadUrl(url);
- }
- return true;
- }
- });
- //背景
- m_imageView = new ImageView(test);
- m_imageView.setImageResource(R.drawable.bg);
- m_imageView.setScaleType(ImageView.ScaleType.FIT_XY);
- //初始化线性布局,增加Buttonbutton的webView控件
- m_topLayout = new LinearLayout(test);
- m_topLayout.setOrientation(LinearLayout.VERTICAL);
- //初始化返回button
- m_backButton = new Button(test);
- m_backButton.setBackgroundResource(R.drawable.back);
- LinearLayout.LayoutParams lypt = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.WRAP_CONTENT);
- lypt.gravity = Gravity.RIGHT;//设置布局类型
- m_backButton.setLayoutParams(lypt);//设置button相对布局位置,靠右
- m_backButton.setOnClickListener(new OnClickListener() {
- @Override//button点击响应事件,删除webView
- public void onClick(View arg0) {
- // TODO Auto-generated method stub
- removeWebView();//以下定义
- }
- });
- m_webLayout.addView(m_imageView);//把image增加的主布局
- m_topLayout.addView(m_backButton);//把返回button增加的线性布局
- m_topLayout.addView(m_webView);//把m_webView增加到线性布局
- m_webLayout.addView(m_topLayout);//把线性布局增加的主布局
- }
- });
- }
- public void removeWebView(){
- //删除m_imageView
- m_webLayout.removeView(m_imageView);
- m_imageView.destroyDrawingCache();
- //删除m_topLayout
- m_webLayout.removeView(m_topLayout);
- m_topLayout.destroyDrawingCache();
- //删除m_webView
- m_topLayout.removeView(m_webView);
- m_webView.destroy();
- //删除m_backButton
- m_topLayout.removeView(m_backButton);
- m_backButton.destroyDrawingCache();
- }
- public boolean onKeyDown(int keyCoder,KeyEvent event)
- {
- //假设网页能够后退,则网页后退。否则删除webView
- if(m_webView.canGoBack() && keyCoder == KeyEvent.KEYCODE_BACK){
- m_webView.goBack();
- }else{
- removeWebView();
- }
- return false;
- }
- }
2、Jni层代码
在Jni/hellocpp文件夹下新建基于cocos2d-x的类test,加入例如以下代码:
- //test.h
- #ifndef TEST_H_
- #define TEST_H_
- extern "C"
- {
- void showWeb();
- } /* namespace cocos2d */
- #endif /* TEST_H_ */
- /*
- * test.cpp
- *
- * Created on: 2014-11-5
- * Author: chen
- */
- #include "test.h"
- #include "cocos2d.h"
- #include "platform/android/jni/JniHelper.h"
- #include <jni.h>
- #define CLASS_NAMEROOT "org/cocos2dx/cpp/AppActivity"
- USING_NS_CC;
- extern "C"
- {
- void showWeb()
- {
- JniMethodInfo t;
- //推断CLASS_NAME的类中是否存在showTipDialog函数,假设存在,则调用。
- if(JniHelper::getStaticMethodInfo(t,CLASS_NAMEROOT,"getInstance","()Lorg/cocos2dx/cpp/AppActivity;"))
- {
- jobject jobj;//存储对象
- jobj = t.env->CallStaticObjectMethod(t.classID,t.methodID);
- bool isHave = JniHelper::getMethodInfo(t,CLASS_NAMEROOT,"openWebview","()V");
- if(isHave)
- {
- t.env->CallVoidMethod(jobj,t.methodID);
- }
- }
- }
- }
3、C++层代码
在classes文件夹下的HelloWorldScene.cpp中的头文件处加入例如以下代码
- #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
- #include "../proj.android/jni/hellocpp/test.h"
- #endif
在menuCloseCallback中加入例如以下代码:
- void HelloWorld::menuCloseCallback(Ref* pSender)
- {
- #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
- showWeb();
- #endif
- }
此时就可实现点击button,载入Android的WebView控件了。可是,另一些工作要做,就是mk文件,
在LOCAL_SRC_FILES加入上新建的test.cpp文件。
例如以下:
- LOCAL_PATH := $(call my-dir)
- include $(CLEAR_VARS)
- $(call import-add-path,$(LOCAL_PATH)/../../cocos2d)
- $(call import-add-path,$(LOCAL_PATH)/../../cocos2d/external)
- $(call import-add-path,$(LOCAL_PATH)/../../cocos2d/cocos)
- LOCAL_MODULE := cocos2dcpp_shared
- LOCAL_MODULE_FILENAME := libcocos2dcpp
- LOCAL_SRC_FILES := hellocpp/main.cpp \
- hellocpp/test.cpp \
- ../../Classes/AppDelegate.cpp \
- ../../Classes/HelloWorldScene.cpp
- LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../Classes
- LOCAL_STATIC_LIBRARIES := cocos2dx_static
- include $(BUILD_SHARED_LIBRARY)
- $(call import-module,.)
有的project可能须要在AndroidManifest中加入网络的权限。例如以下:
- <uses-permission android:name="android.permission.INTERNET"/>
4、编译执行
Cocos2d-x3.3RC0载入Android的WebView的更多相关文章
- Android的WebView控件载入网页显示速度慢的究极解决方案
Android的WebView控件载入网页显示速度慢的究极解决方案 [转载来源自http://hi.baidu.com/goldchocobo/] 秒(甚至更多)时间才会显示出来.研究了很久,搜遍了国 ...
- 【转】Android的WebView控件载入网页显示速度慢的究极解决方案
秒(甚至更多)时间才会显示出来.研究了很久,搜遍了国外很多网站,也看过PhoneGap的代码,一直无解. 一般人堆WebView的加速,都是建议先用webView.getSettings().setB ...
- Cocos2d-x3.3RC0的Android编译Activity启动流程分析
本文将从引擎源代码Jni分析Cocos2d-x3.3RC0的Android Activity的启动流程,以下是具体分析. 1.引擎源代码Jni.部分Java层和C++层代码分析 watermark/2 ...
- Android中Webview使用自定义的javascript进行回调
先说为什么需要讨论这个问题. 现在很多的手机应用,都可能会直接嵌入一个web页面.这样做的好处:一个是功能更新方便,维护起来容易,只需要维护服务器的页面即可,不需要更新客户端:另一个是功能通用,不仅a ...
- 在Android的webview中定做js的alert,confirm和prompt对话框的方法
在Android的webview中定制js的alert,confirm和prompt对话框的方法 http://618119.com/archives/2010/12/20/199.html 1.首先 ...
- Android UI WebView的使用:
Android UI WebView的使用: /** * @author smiling * @date 2016/10 */ 布局: <?xml version="1.0" ...
- (转)在Android的webview中定制js的alert,confirm和prompt对话框的方法
1.首先继承android.webkit.WebChromeClient实现MyWebChromeClient. 2.在MyWebChromeClient.java中覆盖onJsAlert,onJsC ...
- Android中webView的基础使用(一)
WebView是View的一个子类,可以让你在activity中显示网页. 可以在布局文件中写入WebView:比如下面这个写了一个填满整个屏幕的WebView: <?xml version=& ...
- Android之webview详解
文章大纲 一.webview基本介绍1.什么是webview2.为什么要使用webview3.webview基本操作 二.webview高级使用1.WebView状态2.资源加载3.WebView加载 ...
随机推荐
- Java运行报错问题——Picked up JAVA_TOOL_OPTIONS: -agentlib:jvmhook
http://blog.csdn.net/xifeijian/article/details/8830933 上述这个朋友博文提醒,可能是因为其他软件添加了JAVA_HOME的路径造成冲突.但他支持删 ...
- QT,折腾的几天-----关于 QWebEngine的使用
几天前,不,应该是更早以前,就在寻找一种以HTML5+CSS+Javascript的方式来写桌面应用的解决方案,为什么呢?因为前端那套可以随心所欲的写样式界面啊,恩.其实我只是想使用H5的一些新增功能 ...
- SpringBoot开源项目学习总结
一.实现日期格式数据类型的转换 首先,定义DateConverter实现Converter<String, Date>接口: package com.stevlu.common; impo ...
- gym101673G. A Question of Ingestion (DP)
题意:有最多100天 每天有一个食物量 你一开始有一个最大胃口表示你最开始能吃多少食物 如果你昨天吃了 那么今天的胃口为昨天的2/3 如果你前天吃了 昨天没吃 那么你的胃口可以恢复到前天的情况 如果你 ...
- 洛谷——P3807 【模板】卢卡斯定理
P3807 [模板]卢卡斯定理 洛谷智推模板题,qwq,还是太弱啦,组合数基础模板题还没做过... 给定n,m,p($1\le n,m,p\le 10^5$) 求 $C_{n+m}^{m}\ mod\ ...
- 面试总结——Java高级工程师(二)
一.Java底层基础题 1.SpringMVC的原理以及返回数据如何渲染到jsp/html上? 答:Spring MVC的核心就是 DispatcherServlet , 一个请求经过 Dispatc ...
- Object类型转换为String类型
1. Object.toString() 1 obj.toString() 注意:必须保证Object不是null值,否则将抛出NullPointerException异常. 2. (String)O ...
- xfce 安装文泉驿字体
下载文泉驿字体 #拷贝字体到目录/usr/share/fonts/wqy#创建字体缓存 mkfontscale # 在当前目录下生成fonts.scale文件 mkfontdir # 在当前目录下生成 ...
- JAVA之文件操作1,2,3,4
package first_program; import java.io.File; import java.io.IOException; public class num_1v { public ...
- stm32实现iap远程固件更新
前提 想来做iap升级了,应该不是什么新手. 下面的程序需要用到一些简单的功能 串口收发数据开关总中断虽然本文标题是实现远程固件更新,但是具体远程方案本文不做详细说明,重点在于介绍mcu接收到新的固件 ...