iOS平台上的嵌入很順利,網上有現成的教程加代碼,參考如下鏈接中的實現方式:http://www.cocos2dev.com/?p=248
Android平台嵌入 需求:點擊一個按鈕打開Android WebView
1. 通過JNI從cocos2d-x的C++代碼調用java代碼。
這是Android實現WebView嵌入的前提條件,詳細JNI教程:http://www.himigame.com/android-game/725.html
2.Xcode代碼
1.導入頭文件
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)//預編譯 判斷是否是android平台 #include <jni.h> #include "platform/android/jni/JniHelper.h" #include <android/log.h> #endif
2.在按鈕回調方法代碼
void HelloWorld::openWebView(){ #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID) //Jni對象,可以看成結構體 JniMethodInfo minfo; //getStaticMethodInfo,判斷Java靜態函數是否存在,並且把信息保存到minfo里 //參數1:JniMethodInfo //參數2:Java類包名+類名 //參數3:Java函數名稱 //參數4:函數參數類型和返回值類型,這里的返回值類型是Majiang類的對象。寫法:L+包名+; 其他的類型請看上面的“JNI詳細教程” bool isHave = JniHelper::getStaticMethodInfo(minfo,"com/yourcompany/Majiang/Majiang","getInstance","()Lcom/yourcompany/Majiang/Majiang;"); jobject jobj;//存對象 if (isHave) { CCLog("靜態函數存在"); //調用Java靜態函數,取得對象。 jobj = minfo.env->CallStaticObjectMethod(minfo.classID, minfo.methodID); } //getMethodInfo,判斷Java非靜態函數是否存在,並且把信息保存到minfo里 isHave = JniHelper::getMethodInfo(minfo,"com/yourcompany/Majiang/Majiang","openAndroidView","()V"); if (isHave) { CCLog("非靜態函數存在"); //調用java非靜態函數, 參數1:Java對象,上面已經取得 參數2:方法ID minfo.env->CallVoidMethod(jobj, minfo.methodID); } #endif }
3.Java代碼
cocos2d-x的android項目,在eclipse下src目錄里,有一個跟項目名稱相同的類,就在這個類里寫代碼。
這個類初始代碼:
package com.yourcompany.Majiang; import... public class Majiang extends Cocos2dxActivity{ protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); } static { System.loadLibrary("game"); } }
添加代碼后:
public class Majiang extends Cocos2dxActivity{ WebView m_webView; ImageView m_imageView; static Majiang majiang = null; FrameLayout m_webLayout; LinearLayout topLayout; Button backButton; protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); //全局變量保存this majiang=this; //初始化一個空的布局 m_webLayout = new FrameLayout(this); addContentView(m_webLayout, new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT)); } //此函數提供給jni調用,返回自身類的對象 public static Majiang getInstance() {//返回實例 return majiang; } public void openAndroidView() { this.runOnUiThread(new Runnable() {//在主線程里添加別的控件 public void run() { //初始化webView m_webView = new WebView(majiang); //設置webView能夠執行javascript腳本 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(); //如果頁面中鏈接,如果希望點擊鏈接繼續在當前browser中響應 m_webView.setWebViewClient(new WebViewClient(){ public boolean shouldOverrideUrlLoading(WebView view, String url) { if(url.indexOf("tel:")<0){ view.loadUrl(url); } return true; } }); /*背景圖*/ m_imageView = new ImageView(majiang); m_imageView.setImageResource(R.drawable.lobbybg); m_imageView.setScaleType(ImageView.ScaleType.FIT_XY); /*初始化線性布局 里面加按鈕和webView*/ topLayout = new LinearLayout(majiang); topLayout.setOrientation(LinearLayout.VERTICAL); /*初始化返回按鈕*/ backButton = new Button(majiang); backButton.setBackgroundResource(R.drawable.backbutton); backButton.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT)); backButton.setText("關 閉"); backButton.setTextColor(Color.argb(255, 255, 218, 154)); backButton.setTextSize(14); backButton.setOnClickListener(new OnClickListener() { public void onClick(View v) { removeWebView(); } }); //把image加到主布局里 m_webLayout.addView(m_imageView); //把webView加入到線性布局 topLayout.addView(backButton); topLayout.addView(m_webView); //再把線性布局加入到主布局 m_webLayout.addView(topLayout); } }); } //移除webView 把剛才加的所有控件都刪掉 public void removeWebView() { m_webLayout.removeView(m_imageView); m_imageView.destroyDrawingCache(); m_webLayout.removeView(topLayout); topLayout.destroyDrawingCache(); topLayout.removeView(m_webView); m_webView.destroy(); topLayout.removeView(backButton); backButton.destroyDrawingCache(); } public boolean onKeyDown(int keyCoder,KeyEvent event)//重載函數,android手機實體返回鍵回調函數 { if(m_webView.canGoBack() && keyCoder == KeyEvent.KEYCODE_BACK){//如果網頁能回退則后退,如果不能后退移除WebView m_webView.goBack(); }else{ removeWebView(); } return false; } }