cocos2d-x調用android內嵌瀏覽器開啟網頁

來源:互聯網
上載者:User

cocos2d-x調用android內嵌瀏覽器開啟網頁,可以從入口傳入網址,C++調用android 的api即可實現。方法也很簡單

1. 修改“cocos2dx\platform\win32”下的CCApplication.h和CCApplication.cpp,添加函數

標頭檔聲明

void openURL(const char* pszUrl); 

cpp檔案實現:

void CCApplication::openURL(const char* pszUrl)

{ 

    ShellExecuteA(NULL, "open", pszUrl, NULL, NULL, SW_SHOWNORMAL);  

  1. }  
2. 修改“cocos2dx\platform\android”下的CCApplication.h和CCApplication.cpp,添加函數

  1. void CCApplication::openURL(const char* pszUrl)  
  2. {  
  3.     JniMethodInfo minfo;  
  4.           
  5.     if(JniHelper::getStaticMethodInfo(minfo,   
  6.         "org/cocos2dx/application/ApplicationDemo",   
  7.         "openURL",   
  8.         "(Ljava/lang/String;)V"))  
  9.     {  
  10.         jstring StringArg1 = minfo.env->NewStringUTF(pszUrl);  
  11.         minfo.env->CallStaticVoidMethod(minfo.classID, minfo.methodID, StringArg1);  
  12.         minfo.env->DeleteLocalRef(StringArg1);  
  13.         minfo.env->DeleteLocalRef(minfo.classID);  
  14.     }  
  15. }  
3.在src\org\cocos2dx\lib”下的Cocos2dxActivity.java,添加如下語句:

  1. private static Activity me = null;  
  1. protected void onCreate(final Bundle savedInstanceState) {  
  2.     ...  
  3.     me = this;  
  4.     ...  
  5. }  
  6. //返回Cocos2dxActivity對象,用於調用函數
  1. public staticCocos2dxActivity getInstance() {
  2. returnme;
  3. }
  4. public void openURL(String url)   
  5. {   
  6.       Intent i = new Intent(Intent.ACTION_VIEW);    
  7.       i.setData(Uri.parse(url));  
  8.       me.startActivity(i);  
  9. }  
現在就可以在cocos2d-x調用了

首先,C++要調用java代碼,cocos2d-x要調用android的api必須使用到jni庫
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
#include <jni.h>
#include "platform/android/jni/JniHelper.h"
#endif

現在在需要調用的地方:

#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)JniMethodInfo minfo;//getStaticMethodInfo,判斷Java靜態函數是否存在,並且把資訊儲存到minfo裡//參數1:JniMethodInfo//參數2:這個類的路徑+類名//參數3:Java函數名稱//參數4:函數參數類型和傳回值類型//返回一個bool,是否找到該函數bool isHave = JniHelper::getStaticMethodInfo(minfo,"com/yipingtai/org/Webopen","getInstance","()Lcom/yipingtai/org/Webopen;");jobject jobj;//存對象if (isHave) {//這裡的調用靜態getInstance,返回web類的對象。jobj = minfo.env->CallStaticObjectMethod(minfo.classID, minfo.methodID);isHave = JniHelper::getMethodInfo(minfo,"com/yipingtai/org/Webopen","openWebview","(Ljava/lang/String;)V"); if (isHave) { jstring url = minfo.env->NewStringUTF("http://www.baidu.com");//調用 openWebview, 參數1:Test對象   參數2:方法ID  參數3:參數(沒有參數就不寫了)
minfo.env->CallVoidMethod(jobj, minfo.methodID, url);
}}#else    CCDirector::sharedDirector()->end();#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)    exit(0);#endif#endif

這裡用到jni類型簽名,簡單介紹一下
簽名-類型 : Z:bool   B:byte   C:char   S:short   I:int   J:long   F:float   D:double  L:全限定類名   [:數組
類的簽名規則是:“L+全限定類名+;” 三部分組成,其中全限定類名以”/”分隔,而不是用“.”或者“_”分隔。
例如java方法:long fun (int n, String str, int[] arr); 
簽名為:(ILjava/lang/String;[I)J   括弧裡面的內容分成三部分,之間沒有空格,即“I”、“Ljava/lang/String;”和“[I”,分別代表 int、String和int[]。括弧外面是返回值類型簽名,J代表long型。


想深入瞭解,可以百度一下JNI方法簽名規則



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.