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


cocos2d-x調用android內嵌瀏覽器打開網頁,能夠從入口傳入網址,C++調用android 的api就可以實現。

方法也非常easy

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 static Cocos2dxActivity getInstance() {
  2. return me;
  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方法簽名規則




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM