代码部分摘自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。加入例如以下代码:

  1. //AppActivity.java
  2. /****************************************************************************
  3. Copyright (c) 2008-2010 Ricardo Quesada
  4. Copyright (c) 2010-2012 cocos2d-x.org
  5. Copyright (c) 2011 Zynga Inc.
  6. Copyright (c) 2013-2014 Chukong Technologies Inc.
  7.  
  8. http://www.cocos2d-x.org
  9.  
  10. Permission is hereby granted, free of charge, to any person obtaining a copy
  11. of this software and associated documentation files (the "Software"), to deal
  12. in the Software without restriction, including without limitation the rights
  13. to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  14. copies of the Software, and to permit persons to whom the Software is
  15. furnished to do so, subject to the following conditions:
  16.  
  17. The above copyright notice and this permission notice shall be included in
  18. all copies or substantial portions of the Software.
  19.  
  20. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  21. IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  22. FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  23. AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  24. LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  25. OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  26. THE SOFTWARE.
  27. ****************************************************************************/
  28. package org.cocos2dx.cpp;
  29.  
  30. import org.cocos2dx.lib.Cocos2dxActivity;
  31.  
  32. import android.os.Bundle;
  33. import android.view.Gravity;
  34. import android.view.KeyEvent;
  35. import android.view.View;
  36. import android.view.View.OnClickListener;
  37. import android.webkit.WebView;
  38. import android.webkit.WebViewClient;
  39. import android.widget.Button;
  40. import android.widget.FrameLayout;
  41. import android.widget.ImageView;
  42. import android.widget.LinearLayout;
  43.  
  44. import com.pactera.webview.R;
  45.  
  46. public class AppActivity extends Cocos2dxActivity {
  47. static AppActivity test = null;//AppActivity实例
  48. WebView m_webView;//WebView控件
  49. ImageView m_imageView;//ImageView控件
  50. FrameLayout m_webLayout;//FrameLayout布局
  51. LinearLayout m_topLayout;//LinearLayout布局
  52. Button m_backButton;//返回关闭button
  53.  
  54. @Override
  55. protected void onCreate(Bundle savedInstanceState) {
  56. // TODO Auto-generated method stub
  57. super.onCreate(savedInstanceState);
  58. test = this;
  59.  
  60. m_webLayout = new FrameLayout(this);//新建布局
  61. FrameLayout.LayoutParams lytp = new FrameLayout.LayoutParams(640,1000);//布局的尺寸
  62. lytp.gravity = Gravity.CENTER;//布局的Type
  63. addContentView(m_webLayout, lytp);//增加ContentView
  64. }
  65. //初始化activity
  66. public static AppActivity getInstance(){
  67. return test;
  68. }
  69.  
  70. //显示webView
  71. public void openWebview(){
  72. this.runOnUiThread(new Runnable() {//在主线程里载入控件
  73.  
  74. @Override
  75. public void run() {
  76. // TODO Auto-generated method stub
  77. //初始化webview
  78. m_webView = new WebView(test);
  79. //设置webview能够运行js脚本
  80. m_webView.getSettings().setJavaScriptEnabled(true);
  81. //设置缩放工具
  82. m_webView.getSettings().setSupportZoom(true);
  83. m_webView.getSettings().setBuiltInZoomControls(true);
  84. //载入URL
  85. m_webView.loadUrl("http://www.baidu.com/");
  86. //使页面获得焦点
  87. m_webView.requestFocus();
  88. //假设页面中有链接,使链接在当前的浏览器中响应
  89. m_webView.setWebViewClient(new WebViewClient(){
  90. @Override
  91. public boolean shouldOverrideUrlLoading(WebView view,
  92. String url) {
  93. // TODO Auto-generated method stub
  94. if(url.indexOf("tel:")<0){
  95. view.loadUrl(url);
  96. }
  97. return true;
  98. }
  99. });
  100. //背景
  101. m_imageView = new ImageView(test);
  102. m_imageView.setImageResource(R.drawable.bg);
  103. m_imageView.setScaleType(ImageView.ScaleType.FIT_XY);
  104. //初始化线性布局,增加Buttonbutton的webView控件
  105. m_topLayout = new LinearLayout(test);
  106. m_topLayout.setOrientation(LinearLayout.VERTICAL);
  107. //初始化返回button
  108. m_backButton = new Button(test);
  109. m_backButton.setBackgroundResource(R.drawable.back);
  110. LinearLayout.LayoutParams lypt = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,LinearLayout.LayoutParams.WRAP_CONTENT);
  111. lypt.gravity = Gravity.RIGHT;//设置布局类型
  112. m_backButton.setLayoutParams(lypt);//设置button相对布局位置,靠右
  113. m_backButton.setOnClickListener(new OnClickListener() {
  114.  
  115. @Override//button点击响应事件,删除webView
  116. public void onClick(View arg0) {
  117. // TODO Auto-generated method stub
  118. removeWebView();//以下定义
  119. }
  120. });
  121. m_webLayout.addView(m_imageView);//把image增加的主布局
  122. m_topLayout.addView(m_backButton);//把返回button增加的线性布局
  123. m_topLayout.addView(m_webView);//把m_webView增加到线性布局
  124. m_webLayout.addView(m_topLayout);//把线性布局增加的主布局
  125. }
  126. });
  127. }
  128.  
  129. public void removeWebView(){
  130. //删除m_imageView
  131. m_webLayout.removeView(m_imageView);
  132. m_imageView.destroyDrawingCache();
  133. //删除m_topLayout
  134. m_webLayout.removeView(m_topLayout);
  135. m_topLayout.destroyDrawingCache();
  136. //删除m_webView
  137. m_topLayout.removeView(m_webView);
  138. m_webView.destroy();
  139. //删除m_backButton
  140. m_topLayout.removeView(m_backButton);
  141. m_backButton.destroyDrawingCache();
  142. }
  143. public boolean onKeyDown(int keyCoder,KeyEvent event)
  144. {
  145. //假设网页能够后退,则网页后退。否则删除webView
  146. if(m_webView.canGoBack() && keyCoder == KeyEvent.KEYCODE_BACK){
  147. m_webView.goBack();
  148. }else{
  149. removeWebView();
  150. }
  151. return false;
  152. }
  153.  
  154. }

2、Jni层代码

在Jni/hellocpp文件夹下新建基于cocos2d-x的类test,加入例如以下代码:

  1. //test.h
  2. #ifndef TEST_H_
  3. #define TEST_H_
  4.  
  5. extern "C"
  6. {
  7. void showWeb();
  8. } /* namespace cocos2d */
  9. #endif /* TEST_H_ */

  1. /*
  2. * test.cpp
  3. *
  4. * Created on: 2014-11-5
  5. * Author: chen
  6. */
  7.  
  8. #include "test.h"
  9. #include "cocos2d.h"
  10. #include "platform/android/jni/JniHelper.h"
  11. #include <jni.h>
  12. #define CLASS_NAMEROOT "org/cocos2dx/cpp/AppActivity"
  13. USING_NS_CC;
  14.  
  15. extern "C"
  16. {
  17. void showWeb()
  18. {
  19. JniMethodInfo t;
  20. //推断CLASS_NAME的类中是否存在showTipDialog函数,假设存在,则调用。
  21. if(JniHelper::getStaticMethodInfo(t,CLASS_NAMEROOT,"getInstance","()Lorg/cocos2dx/cpp/AppActivity;"))
  22. {
  23. jobject jobj;//存储对象
  24. jobj = t.env->CallStaticObjectMethod(t.classID,t.methodID);
  25. bool isHave = JniHelper::getMethodInfo(t,CLASS_NAMEROOT,"openWebview","()V");
  26. if(isHave)
  27. {
  28. t.env->CallVoidMethod(jobj,t.methodID);
  29. }
  30.  
  31. }
  32. }
  33. }

3、C++层代码

在classes文件夹下的HelloWorldScene.cpp中的头文件处加入例如以下代码

  1. #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
  2. #include "../proj.android/jni/hellocpp/test.h"
  3. #endif

在menuCloseCallback中加入例如以下代码:

  1. void HelloWorld::menuCloseCallback(Ref* pSender)
  2. {
  3. #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
  4. showWeb();
  5. #endif
  6. }

此时就可实现点击button,载入Android的WebView控件了。可是,另一些工作要做,就是mk文件,

在LOCAL_SRC_FILES加入上新建的test.cpp文件。

例如以下:

  1. LOCAL_PATH := $(call my-dir)
  2.  
  3. include $(CLEAR_VARS)
  4.  
  5. $(call import-add-path,$(LOCAL_PATH)/../../cocos2d)
  6. $(call import-add-path,$(LOCAL_PATH)/../../cocos2d/external)
  7. $(call import-add-path,$(LOCAL_PATH)/../../cocos2d/cocos)
  8.  
  9. LOCAL_MODULE := cocos2dcpp_shared
  10.  
  11. LOCAL_MODULE_FILENAME := libcocos2dcpp
  12.  
  13. LOCAL_SRC_FILES := hellocpp/main.cpp \
  14. hellocpp/test.cpp \
  15. ../../Classes/AppDelegate.cpp \
  16. ../../Classes/HelloWorldScene.cpp
  17.  
  18. LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../Classes
  19.  
  20. LOCAL_STATIC_LIBRARIES := cocos2dx_static
  21.  
  22. include $(BUILD_SHARED_LIBRARY)
  23.  
  24. $(call import-module,.)

有的project可能须要在AndroidManifest中加入网络的权限。例如以下:

  1. <uses-permission android:name="android.permission.INTERNET"/>

4、编译执行

Cocos2d-x3.3RC0载入Android的WebView的更多相关文章

  1. Android的WebView控件载入网页显示速度慢的究极解决方案

    Android的WebView控件载入网页显示速度慢的究极解决方案 [转载来源自http://hi.baidu.com/goldchocobo/] 秒(甚至更多)时间才会显示出来.研究了很久,搜遍了国 ...

  2. 【转】Android的WebView控件载入网页显示速度慢的究极解决方案

    秒(甚至更多)时间才会显示出来.研究了很久,搜遍了国外很多网站,也看过PhoneGap的代码,一直无解. 一般人堆WebView的加速,都是建议先用webView.getSettings().setB ...

  3. Cocos2d-x3.3RC0的Android编译Activity启动流程分析

    本文将从引擎源代码Jni分析Cocos2d-x3.3RC0的Android Activity的启动流程,以下是具体分析. 1.引擎源代码Jni.部分Java层和C++层代码分析 watermark/2 ...

  4. Android中Webview使用自定义的javascript进行回调

    先说为什么需要讨论这个问题. 现在很多的手机应用,都可能会直接嵌入一个web页面.这样做的好处:一个是功能更新方便,维护起来容易,只需要维护服务器的页面即可,不需要更新客户端:另一个是功能通用,不仅a ...

  5. 在Android的webview中定做js的alert,confirm和prompt对话框的方法

    在Android的webview中定制js的alert,confirm和prompt对话框的方法 http://618119.com/archives/2010/12/20/199.html 1.首先 ...

  6. Android UI WebView的使用:

    Android UI WebView的使用: /** * @author smiling * @date 2016/10 */ 布局: <?xml version="1.0" ...

  7. (转)在Android的webview中定制js的alert,confirm和prompt对话框的方法

    1.首先继承android.webkit.WebChromeClient实现MyWebChromeClient. 2.在MyWebChromeClient.java中覆盖onJsAlert,onJsC ...

  8. Android中webView的基础使用(一)

    WebView是View的一个子类,可以让你在activity中显示网页. 可以在布局文件中写入WebView:比如下面这个写了一个填满整个屏幕的WebView: <?xml version=& ...

  9. Android之webview详解

    文章大纲 一.webview基本介绍1.什么是webview2.为什么要使用webview3.webview基本操作 二.webview高级使用1.WebView状态2.资源加载3.WebView加载 ...

随机推荐

  1. Java运行报错问题——Picked up JAVA_TOOL_OPTIONS: -agentlib:jvmhook

    http://blog.csdn.net/xifeijian/article/details/8830933 上述这个朋友博文提醒,可能是因为其他软件添加了JAVA_HOME的路径造成冲突.但他支持删 ...

  2. QT,折腾的几天-----关于 QWebEngine的使用

    几天前,不,应该是更早以前,就在寻找一种以HTML5+CSS+Javascript的方式来写桌面应用的解决方案,为什么呢?因为前端那套可以随心所欲的写样式界面啊,恩.其实我只是想使用H5的一些新增功能 ...

  3. SpringBoot开源项目学习总结

    一.实现日期格式数据类型的转换 首先,定义DateConverter实现Converter<String, Date>接口: package com.stevlu.common; impo ...

  4. gym101673G. A Question of Ingestion (DP)

    题意:有最多100天 每天有一个食物量 你一开始有一个最大胃口表示你最开始能吃多少食物 如果你昨天吃了 那么今天的胃口为昨天的2/3 如果你前天吃了 昨天没吃 那么你的胃口可以恢复到前天的情况 如果你 ...

  5. 洛谷——P3807 【模板】卢卡斯定理

    P3807 [模板]卢卡斯定理 洛谷智推模板题,qwq,还是太弱啦,组合数基础模板题还没做过... 给定n,m,p($1\le n,m,p\le 10^5$) 求 $C_{n+m}^{m}\ mod\ ...

  6. 面试总结——Java高级工程师(二)

    一.Java底层基础题 1.SpringMVC的原理以及返回数据如何渲染到jsp/html上? 答:Spring MVC的核心就是 DispatcherServlet , 一个请求经过 Dispatc ...

  7. Object类型转换为String类型

    1. Object.toString() 1 obj.toString() 注意:必须保证Object不是null值,否则将抛出NullPointerException异常. 2. (String)O ...

  8. xfce 安装文泉驿字体

    下载文泉驿字体 #拷贝字体到目录/usr/share/fonts/wqy#创建字体缓存 mkfontscale # 在当前目录下生成fonts.scale文件 mkfontdir # 在当前目录下生成 ...

  9. JAVA之文件操作1,2,3,4

    package first_program; import java.io.File; import java.io.IOException; public class num_1v { public ...

  10. stm32实现iap远程固件更新

    前提 想来做iap升级了,应该不是什么新手. 下面的程序需要用到一些简单的功能 串口收发数据开关总中断虽然本文标题是实现远程固件更新,但是具体远程方案本文不做详细说明,重点在于介绍mcu接收到新的固件 ...