代码部分摘自http://www.fusijie.com/blog/2013/12/26/play-cocos2dx-33/

Cocos2d-x3.3RC0通过Jni嵌入Android的WebView空间,在Cocos2d-x中显示网页。直接上代码。

1、Java层代码

用ADT打开proj.android的工程目录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;//返回关闭按钮
	
	@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);
				//初始化线性布局,增加Button按钮的webView控件
				m_topLayout = new LinearLayout(test);
				m_topLayout.setorientation(LinearLayout.VERTICAL);
				//初始化返回按钮
				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);//设置按钮相对布局位置,靠右
				m_backButton.setonClickListener(new OnClickListener() {
					
					@Override//按钮点击响应事件,删除webView
					public void onClick(View arg0) {
						// Todo Auto-generated method stub
						removeWebView();//下面定义
					}
				});
				m_webLayout.addView(m_imageView);//把image加入的主布局
				m_topLayout.addView(m_backButton);//把返回按钮加入的线性布局
				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,"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
}

此时就可实现点击按钮,加载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,.)
有的工程可能需要在AndroidManifest中添加网络的权限,如下:
<uses-permission android:name="android.permission.INTERNET"/>

4、编译运行

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

  1. 详解如何通过H5(浏览器/WebView/其他)唤起本地app

    这篇文章主要介绍了详解如何通过H5(浏览器/WebView/其他)唤起本地app的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. HTML5页面无缝闪开的问题及解决方案

    这篇文章主要介绍了HTML5页面无缝闪开方案,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  3. ios – 在WKWebView中获取链接URL

    我想在WKWebView中获取tapped链接的url.链接采用自定义格式,可触发应用中的某些操作.例如HTTP://我的网站/帮助#深层链接对讲.我这样使用KVO:这在第一次点击链接时效果很好.但是,如果我连续两次点击相同的链接,它将不报告链接点击.是否有解决方法来解决这个问题,以便我可以检测每个点击并获取链接?任何关于这个的指针都会很棒!解决方法像这样更改addobserver在observeValue函数中,您可以获得两个值

  4. ios – 永远不会调用shouldStartLoadWithRequest

    我已经研究和研究,但仍然不明白为什么从未调用过StartLoadWithRequest.我的页面加载正常,并调用了一些UIWebview委托协议方法.请从以下代码中找到相关的摘要:在我的.m中合成我的webview(在头文件中定义):我成功加载了我的webview:把我的代表设置为自己我的所有协议方法都被称为EXCEPTshouldStartLoadWithRequest提前致谢.解决方法尝试在V

  5. ios – UIWebView不适合设备屏幕

    我有一个网页视图,我想填写iDevice的全屏.我把它放在视图中心设置为中心并与容器边缘齐平.然而,当我加载应用程序时,视图比它运行的模拟iPhone大.我做了一些搜索,一些建议自动布局,这已经应该是视图的中心.我发现的另一件事是通过代码设置大小.我甚至将应用程序从通用应用程序更改为iPhone,对布局没有影响.完整来源:解决方法设置缩放以适合视图边界.试试这个:希望这可以帮助..:)

  6. ios – 如何在Swift中手动为UIWebView设置Cookie

    我需要在swift中为webview设置一个cookie.我找到了一个解决方案,但它是针对objective-c的.如何在Swift中做到这一点?

  7. iOS – 防止UIAppearance设置更改UIWebView输入附件视图

    我的应用程序中有一个UIWebView,问题是我有一个UIAppearance来修改分段控件的外观,因此它修改了UIWebView文本字段的输入附件视图中的分段控件,我希望它看起来不错,或者不试图修改它.这就是它目前的样子:解决方法我只是通过使用[UIAppearanceappearanceWhenContainedIn:]而不是[UIAppearance外观]来解决这个问题.通过向选择器发送包含

  8. ios – 如何为UIWebView设置自定义键盘

    如何为iOS7及更高版本的可编辑UIWebView显示自定义键盘和输入附件视图.即:如何设置和使用[UIWebViewsetInputView:]和[UIWebViewsetInputAccessoryView:]中的值解决方法理解你想要做什么会有所帮助?您可以尝试强制使用特定类型的键盘,例如数字,电子邮件等,这些键盘将使用用户在其设备(或系统)上明确安装的键盘.为此,您可以参考thisapple

  9. xcode – 无法在iOS8beta5中使用UIWebView打开PDF文件

    如果是,请提供一些示例代码.解决方法我找到了一种在WebView中查看PDF的解决方法

  10. iOS从UIWebview内容创建pdf

    哪个是从webview内容中获取最佳质量pdf文档的最佳选择?

随机推荐

  1. 【cocos2d-x 3.x 学习笔记】对象内存管理

    Cocos2d-x的内存管理cocos2d-x中使用的是上面的引用计数来管理内存,但是又增加了一些自己的特色。cocos2d-x中通过Ref类来实现引用计数,所有需要实现内存自动回收的类都应该继承自Ref类。下面是Ref类的定义:在cocos2d-x中创建对象通常有两种方式:这两中方式的差异可以参见我另一篇博文“对象创建方式讨论”。在cocos2d-x中提倡使用第二种方式,为了避免误用第一种方式,一般将构造函数设为protected或private。参考资料:[1]cocos2d-x高级开发教程2.3节[

  2. 利用cocos2dx 3.2开发消灭星星六如何在cocos2dx中显示中文

    由于编码的不同,在cocos2dx中的Label控件中如果放入中文字,往往会出现乱码。为了方便使用,我把这个从文档中获取中文字的方法放在一个头文件里面Chinese.h这里的tex_vec是cocos2dx提供的一个保存文档内容的一个容器。这里给出ChineseWords,xml的格式再看看ChineseWord的实现Chinese.cpp就这样,以后在需要用到中文字的地方,就先include这个头文件然后调用ChineseWord函数,获取一串中文字符串。

  3. 利用cocos2dx 3.2开发消灭星星七关于星星的算法

    在前面,我们已经在GameLayer中利用随机数初始化了一个StarMatrix,如果还不知道怎么创建星星矩阵请回去看看而且我们也讲了整个游戏的触摸事件的派发了。

  4. cocos2dx3.x 新手打包APK注意事项!

    这个在编译的时候就可以发现了比较好弄这只是我遇到的,其他的以后遇到再补充吧。。。以前被这两个问题坑了好久

  5. 利用cocos2dx 3.2开发消灭星星八游戏的结束判断与数据控制

    如果你看完之前的,那么你基本已经拥有一个消灭星星游戏的雏形。开始把剩下的两两互不相连的星星消去。那么如何判断是GameOver还是进入下一关呢。。其实游戏数据贯穿整个游戏,包括星星消除的时候要加到获得分数上,消去剩下两两不相连的星星的时候的加分政策等,因此如果前面没有做这一块的,最好回去搞一搞。

  6. 利用cocos2dx 3.2开发消灭星星九为游戏添加一些特效

    needClear是一个flag,当游戏判断不能再继续后,这个flag变为true,开始消除剩下的星星clearSumTime是一个累加器ONE_CLEAR_TIME就是每颗星星消除的时间2.连击加分信息一般消除一次星星都会有连击信息和加多少分的信息。其实这些combo标签就是一张图片,也是通过控制其属性或者runAction来实现。源码ComboEffect.hComboEffect.cpp4.消除星星粒子效果消除星星时,为了实现星星爆裂散落的效果,使用了cocos2d提供的粒子特效引擎对于粒子特效不了

  7. 02 Cocos2D-x引擎win7环境搭建及创建项目

    官网有搭建的文章,直接转载记录。环境搭建:本文介绍如何搭建Cocos2d-x3.2版本的开发环境。项目创建:一、通过命令创建项目前面搭建好环境后,怎样创建自己的Cocos2d-x项目呢?先来看看Cocos2d-x3.2的目录吧这就是Cocos2d-x3.2的目录。输入cocosnew项目名–p包名–lcpp–d路径回车就创建成功了例如:成功后,找到这个项目打开proj.win32目录下的Hello.slnF5成功了。

  8. 利用cocos2dx 3.2开发消灭星星十为游戏添加音效项目源码分享

    一个游戏,声音也是非常的重要,其实cocos2dx里面的简单音效引擎的使用是非常简单的。我这里只不过是用一个类对所有的音效进行管理罢了。Audio.hAudio.cpp好了,本系列教程到此结束,第一次写教程如有不对请见谅或指教,谢谢大家。最后附上整个项目的源代码点击打开链接

  9. 03 Helloworld

    程序都有一个入口点,在C++就是main函数了,打开main.cpp,代码如下:123456789101112131415161718#include"main.h"#include"AppDelegate.h"#include"cocos2d.h"USING_NS_CC;intAPIENTRY_tWinMain{UNREFERENCED_ParaMETER;UNREFERENCED_ParaMETER;//createtheapplicationinstanceAppDelegateapp;return

  10. MenuItemImage*图标菜单创建注意事项

    学习cocos2dx,看的是cocos2d-x3.x手游开发实例详解,这本书错误一大把,本着探索求知勇于发现错误改正错误的精神,我跟着书上的例子一起调试,当学习到场景切换这个小节的时候,出了个错误,卡了我好几个小时。

返回
顶部