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);
- }
- void CCApplication::openURL(const char* pszUrl)
- {
- JniMethodInfo minfo;
- if(JniHelper::getStaticMethodInfo(minfo,
- "org/cocos2dx/application/ApplicationDemo",
- "openURL",
- "(Ljava/lang/String;)V"))
- {
- jstring StringArg1 = minfo.env->NewStringUTF(pszUrl);
- minfo.env->CallStaticVoidMethod(minfo.classID, minfo.methodID, StringArg1);
- minfo.env->DeleteLocalRef(StringArg1);
- minfo.env->DeleteLocalRef(minfo.classID);
- }
- }
- private static Activity me = null;
- protected void onCreate(final Bundle savedInstanceState) {
- ...
- me = this;
- ...
- }
- //返回Cocos2dxActivity對象,用於調用函數
- public static Cocos2dxActivity getInstance() {
- return me;
- }
- public void openURL(String url)
- {
- Intent i = new Intent(Intent.ACTION_VIEW);
- i.setData(Uri.parse(url));
- me.startActivity(i);
- }
首先,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方法簽名規則
