標籤: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的工程目錄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 <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}
此時就可實現點擊按鈕,載入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中添加網路的許可權,如下:
<uses-permission android:name="android.permission.INTERNET"/>
4、編譯運行
Cocos2d-x3.3RC0載入Android的WebView