在看这篇文章之前,建议先看一下我的湖南长沙房卡麻将学习 二, 因为看完二才能整体把握。
请求发送流程:
看过场景初始化就知道Scene *pScene = HNGame::scene(); 启动流程。
HNGame.cpp:
HNGame::scene(); ->
HNGame::init() ->
new HNScenceManager(this);
↓
HNScenceManager.cpp:
HNScenceManager::init() ->
new HNLogonScence;
↓
HNLogonScence.cpp:
HNLogonScence::init()->
WidgetManager::addButtonCB("Button_WeiXinLogon",this,button_selector(HNLogonScence::Button_WeiXinLogon)); ->
void HNLogonScence::Button_WeiXinLogon(cocos2d::Ref*,WidgetUserInfo*)->
MissionWeiXin::Instance().logonWeiXin();
↓
MissionWeiXin.cpp:
MissionWeiXin::logonWeiXin()->
JniFun::longinWX("","");
↓
JniFun.cpp:
longinWX()->
此处从cpp中调用java函数,JAVA_CLASSNAME为java的类名, LoginWX为方法。
bool isHave = JniHelper::getStaticMethodInfo(minfo,JAVA_CLASSNAME,"LoginWX","(Ljava/lang/String;Ljava/lang/String;)V");
↓
Native.java:
LoginWX()->
开始调用微信的api库
intent.putExtra(WXEntryActivity.ReqWxLogin,"wxlogin");
Cocos2dxActivity.getContext().startActivity(intent);
↓
WXEntryActivity.java:
onCreate()->
设置响应回调
api.handleIntent(intent, this);
发送登录请求
reqLogin(); ->
发送后产生回调
onReq(BaseReq req)
上面就是微信的请求发送流程,登录请求发送后,微信会有响应回调,下面看一下响应流程:
WXEntryActivity.java:
public void onResp(BaseResp resp)->
case BaseResp.ErrCode.ERR_OK: //成功
Native.WxLoginGetAccessToken(Url);
↓
Native.java:
WxLoginGetAccessToken()-> // jni调用, java调用cpp
↓
JniCallback.cpp:
Java_org_cocos2dx_cpp_Native_WxLoginGetAccessToken() ->
MissionWeiXin::Instance().Req_Access_token(data);
↓
MissionWeiXin.cpp:
Req_Access_token()->
通过http协议获取
MCWebReq::instance().sendRequestDocumentUrl(kUrl,CC_CALLBACK_1(MissionWeiXin::Rsp_Access_token,this),nullptr); ->
Rsp_Access_token()->
Req_UserInfo(access_token,openid);->
通过http协议获取
MCWebReq::instance().sendRequestDocumentUrl(kUrl,CC_CALLBACK_1(MissionWeiXin::Rsp_UserInfo,this),nullptr);->
Rsp_UserInfo()->
m_pJinMissionSink->onWxLoginSuccess(kWxUserInfo);
↓
HNLogonScence.cpp:
onWxLoginSuccess(WxUserInfo kWxUserInfo )
从上面的请求发送流程和响应流程可以看出,微信登录请求在HNLogonScence.cpp中发送,最终响应也在HNLogonScence.cpp处理,其它文件函数在其中起到桥梁的作用,连接java和cpp。
另:
服务器address和Port配置:
proj.android\assets\Script\HNScriptValue.xml
在HNGame.cpp的init()中初始化:
cocos2d::ScriptXMLparse kScriptXml1("Script/HNScriptValue.xml");