代码部分摘自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 QuesadaCopyright (c) 2010-2012 cocos2d-x.orgCopyright (c) 2011      Zynga Inc.Copyright (c) 2013-2014 Chukong Technologies Inc. http://www.cocos2d-x.orgPermission is hereby granted, free of charge, to any person obtaining a copyof this software and associated documentation files (the "Software"), to dealin the Software without restriction, including without limitation the rightsto use, copy, modify, merge, publish, distribute, sublicense, and/or sellcopies of the Software, and to permit persons to whom the Software isfurnished to do so, subject to the following conditions:The above copyright notice and this permission notice shall be included inall copies or substantial portions of the Software.THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS ORIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THEAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHERLIABILITY, 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 INTHE 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;//返回关闭按钮@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);test = this;m_webLayout = new FrameLayout(this);//新建布局FrameLayout.LayoutParams lytp = new FrameLayout.LayoutParams(640,1000);//布局的尺寸lytp.gravity = Gravity.CENTER;//布局的TypeaddContentView(m_webLayout, lytp);//加入ContentView}//初始化activitypublic static AppActivity getInstance(){return test;}//显示webViewpublic void openWebview(){this.runOnUiThread(new Runnable() {//在主线程里加载控件@Overridepublic void run() {// TODO Auto-generated method stub//初始化webviewm_webView = new WebView(test);//设置webview可以执行js脚本m_webView.getSettings().setJavaScriptEnabled(true);//设置缩放工具m_webView.getSettings().setSupportZoom(true);m_webView.getSettings().setBuiltInZoomControls(true);//载入URLm_webView.loadUrl("http://www.baidu.com/");//使页面获得焦点m_webView.requestFocus();//如果页面中有链接,使链接在当前的浏览器中响应m_webView.setWebViewClient(new WebViewClient(){@Overridepublic boolean shouldOverrideUrlLoading(WebView view,String url) {// TODO Auto-generated method stubif(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//按钮点击响应事件,删除webViewpublic void onClick(View arg0) {// TODO Auto-generated method stubremoveWebView();//下面定义}});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_imageViewm_webLayout.removeView(m_imageView);m_imageView.destroyDrawingCache();//删除m_topLayoutm_webLayout.removeView(m_topLayout);m_topLayout.destroyDrawingCache();//删除m_webViewm_topLayout.removeView(m_webView);m_webView.destroy();//删除m_backButtonm_topLayout.removeView(m_backButton);m_backButton.destroyDrawingCache();}public boolean onKeyDown(int keyCoder,KeyEvent event){//如果网页可以后退,则网页后退,否则删除webViewif(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 #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}

此时就可实现点击按钮,加载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_sharedLOCAL_MODULE_FILENAME := libcocos2dcppLOCAL_SRC_FILES := hellocpp/main.cpp \   hellocpp/test.cpp \                   ../../Classes/AppDelegate.cpp \                   ../../Classes/HelloWorldScene.cppLOCAL_C_INCLUDES := $(LOCAL_PATH)/../../ClassesLOCAL_STATIC_LIBRARIES := cocos2dx_staticinclude $(BUILD_SHARED_LIBRARY)$(call import-module,.)
有的工程可能需要在AndroidManifest中添加网络的权限,如下:

4、编译运行



更多相关文章

  1. 安卓入门.RelativeLayout相对布局2
  2. android Button源码分析
  3. Android(安卓)Layout XML属性
  4. PhoneGap Developer App 安卓(android)调试工具免费下载
  5. Ant 打包 Android(安卓)Project
  6. Android(安卓)Framework层Power键关机流程
  7. Android如何代码混淆
  8. Android(安卓)L下载
  9. android背景选择器selector用法、自定义Button按钮样式.........

随机推荐

  1. [DM]分类-贝叶斯分类
  2. [DM]分类-决策树
  3. [DM]分类-神经网络
  4. flex容器中的四个属性的功能演示
  5. 323作业
  6. 磁盘存储管理和文件系统管理 RAID
  7. 中国各地级市坡度和经纬度数据正式开放!
  8. 政策评估的经典计量方法, 以及政策干预评
  9. 世界范围位列前500的经济学家名单, 中国
  10. Top5上最短的经济学论文, 这5篇短到可以