cocs2d-js 3.0 js与c++交互

以前也写过js与c++的交互不过那是cocos2d-js 2.x 的版本(需要的可以搜博文),现在更新到3.0的版本,调用的方法还是有许多区别。经过本人研究得以有所收获,本人一向本着分享的原则愿后学少些弯路,现贴上本人的代码,具体不做解释,相信诸位看过即可明白大意。

1.先贴上.h文件代码:

//

//  JsDiaoC.h

//  projectName

//

//  Created by zcl on 14-8-10.

//

//


#ifndef __projectName__JsDiaoC__

#define __projectName__JsDiaoC__


#include <iostream>

#include "jsb_cocos2dx_auto.hpp"

#include "jsb_cocos2dx_ui_auto.hpp"

#include "jsb_cocos2dx_studio_auto.hpp"

#include "jsb_cocos2dx_builder_auto.hpp"

#include "jsb_cocos2dx_spine_auto.hpp"

#include "jsb_cocos2dx_extension_auto.hpp"

#include "ui/jsb_cocos2dx_ui_manual.h"

#include "cocostudio/jsb_cocos2dx_studio_manual.h"

#include "cocosbuilder/js_bindings_ccbreader.h"

#include "spine/jsb_cocos2dx_spine_manual.h"

#include "extension/jsb_cocos2dx_extension_manual.h"

#include "localstorage/js_bindings_system_registration.h"

#include "chipmunk/js_bindings_chipmunk_registration.h"

#include "jsb_opengl_registration.h"

#include "network/XMLHTTPRequest.h"

#include "network/jsb_websocket.h"

#include "network/jsb_socketio.h"

#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)

#include "platform/android/CCJavascriptJavaBridge.h"

#endif

#include <stdio.h>

#include "jsapi.h"

#include "MyFun.h"

using namespace std;

using namespace CocosDenshion;

class JieGuaItem:publiccocos2d::Ref{

public:

//注册函数

void register_jsb_os_info(JSContext *cx,JSObject *obj);

string guaCi(string k);

string showWeb(string url,string data,cocos2d::Rect rect);

string hideWeb(string s);

string checkNetWork();

string openSafari(string url);//打开官方首页

string outStream(vector<string> data,vector<string> format);

vector<string> inStream(string data,vector<string> format);

string sheBeiNum();//设备号获取js

string showMsgBox(string msg);

string buy(int type);

string shareJiePingImg(string title,string content,string url,string name);//分享图片

string getCurTime();

bool jsb_os_guaCi(JSContext *cx,uint32_t argc,JS::Value *vp);

bool jsb_os_showWeb(JSContext *cx,uint32_t argc,JS::Value *vp);

bool jsb_os_hideWeb(JSContext *cx,uint32_t argc,JS::Value *vp);

bool jsb_os_checkNetWork(JSContext *cx,uint32_t argc,JS::Value *vp);

bool jsb_os_openSafari(JSContext *cx,uint32_t argc,JS::Value *vp);

bool jsb_os_outStream(JSContext *cx,uint32_t argc,JS::Value *vp);

bool jsb_os_inStream(JSContext *cx,uint32_t argc,JS::Value *vp);

bool jsb_os_sheBeiNum(JSContext *cx,uint32_t argc,JS::Value *vp);

bool jsb_os_showMsgBox(JSContext *cx,uint32_t argc,JS::Value *vp);

bool jsb_os_buy(JSContext *cx,uint32_t argc,JS::Value *vp);

bool jsb_os_shareJiePingImg(JSContext *cx,uint32_t argc,JS::Value *vp);

bool jsb_os_getCurTime(JSContext *cx,uint32_t argc,JS::Value *vp);

//c++调用js

void os_jsb_phpEncrypt(string data);

void os_jsb_iosIap(string productId);

#endif /* defined(__projectName__JsDiaoC__) */


2.再贴上.cpp的文件代码:

//

//  JsDiaoC.cpp

//  projectName

//

//  Created by zcl on 14-8-10.

//

//


#include "JsDiaoC.h"

#include "extensions/cocos-ext.h"

#include "cocos2d.h"

#include "tinyxml2/tinyxml2.h"

#include "Android_Ios.h"

#include "OutPutStream.h"

#include "InPutStream.h"

#include "MyFun.h"

#include "ZCLBase64.h"

#include <vector>

USING_NS_CC;

using namespace tinyxml2;


void register_jsb_os_info(JSContext *cx,JSObject *obj) {

    JS_DefineFunction(cx, obj,"js_guaCi",jsb_os_guaCi,0,0);

    JS_DefineFunction(cx, obj,"js_showWeb",jsb_os_showWeb,0,0);

    JS_DefineFunction(cx, obj,"js_hideWeb",jsb_os_hideWeb,0,0);

    JS_DefineFunction(cx, obj,"js_checkNetWork",jsb_os_checkNetWork,0,0);

    JS_DefineFunction(cx, obj,"js_openSafari",jsb_os_openSafari,0,0);

    JS_DefineFunction(cx, obj,"js_outStream",jsb_os_outStream,0,0);

    JS_DefineFunction(cx, obj,"js_inStream",jsb_os_inStream,0,0);

    JS_DefineFunction(cx, obj,"js_sheBeiNum",jsb_os_sheBeiNum,0,0);

    JS_DefineFunction(cx, obj,"js_showMsgBox",jsb_os_showMsgBox,0,0);

    JS_DefineFunction(cx, obj,"js_buy",jsb_os_buy,0,0);

    JS_DefineFunction(cx, obj,"js_shareJiePingImg",jsb_os_shareJiePingImg,0,0);

    JS_DefineFunction(cx, obj,"js_getCurTime",jsb_os_getCurTime,0,0);

}

bool jsb_os_guaCi(JSContext *cx,uint32_t argc,JS::Value *vp) {

   jsval *argv =JS_ARGV(cx, vp);

   JSStringWrapper pW(argv[0]);

    jsval ret =std_string_to_jsval(cx,guaCi(pW.get()));

   JS_SET_RVAL(cx, vp, ret);

    

    return true;

}

bool jsb_os_showWeb(JSContext *cx,uint32_t argc,JS::Value *vp) {

   jsval *argv =JS_ARGV(cx, vp);

   JSStringWrapper pW(argv[0]);

   JSStringWrapper pW1(argv[1]);

   Rect rect;

   jsval_to_ccrect(cx, argv[2], &rect);

    jsval ret =std_string_to_jsval(cx,showWeb

                                    (pW.get(),pW1.get(),rect));

   JS_SET_RVAL(cx, vp, ret);

    return true;

}

bool jsb_os_hideWeb(JSContext *cx,uint32_t argc,JS::Value *vp) {

   jsval *argv =JS_ARGV(cx, vp);

   JSStringWrapper pW(argv[0]);

    jsval ret =std_string_to_jsval(cx,hideWeb

                                    (pW.get()));

   JS_SET_RVAL(cx, vp, ret);

    return true;

}


bool jsb_os_checkNetWork(JSContext *cx,uint32_t argc,JS::Value *vp){

    jsval ret =std_string_to_jsval(cx,checkNetWork());

   JS_SET_RVAL(cx, vp, ret);

    return true;

}

bool jsb_os_openSafari(JSContext *cx,uint32_t argc,JS::Value *vp){

   jsval *argv =JS_ARGV(cx, vp);

   JSStringWrapper pW(argv[0]);

    jsval ret =std_string_to_jsval(cx,openSafari(pW.get()));

   JS_SET_RVAL(cx, vp, ret);

    return true;

}

bool jsb_os_outStream(JSContext *cx,uint32_t argc,JS::Value *vp) {

   jsval *argv =JS_ARGV(cx, vp);

    vector<string>vec;

    jsval_to_std_vector_string(cx, argv[0], &vec);

    vector<string>vec1;

    jsval_to_std_vector_string(cx, argv[1], &vec1);

   jsval ret =std_string_to_jsval(cx,outStream(vec,vec1));

   JS_SET_RVAL(cx, vp, ret);

    return true;

}

bool jsb_os_inStream(JSContext *cx,uint32_t argc,JS::Value *vp) {

   jsval *argv =JS_ARGV(cx, vp);

   JSStringWrapper pW(argv[0]);

    vector<string>vec;

    jsval_to_std_vector_string(cx, argv[1], &vec);

    jsval ret =std_vector_string_to_jsval(cx,inStream(pW.get(),vec));

   JS_SET_RVAL(cx, vp, ret);

    return true;

}

bool jsb_os_sheBeiNum(JSContext *cx,uint32_t argc,JS::Value *vp){

   jsval *argv =JS_ARGV(cx, vp);

    jsval ret =std_string_to_jsval(cx,sheBeiNum());

   JS_SET_RVAL(cx, vp, ret);

    return true;

}

bool jsb_os_showMsgBox(JSContext *cx,uint32_t argc,JS::Value *vp){

   jsval *argv =JS_ARGV(cx, vp);

   JSStringWrapper pW(argv[0]);

    jsval ret =std_string_to_jsval(cx,showMsgBox(pW.get()));

   JS_SET_RVAL(cx, vp, ret);

    return true;

}

bool jsb_os_buy(JSContext *cx,uint32_t argc,JS::Value *vp){

   jsval *argv =JS_ARGV(cx, vp);

   int k;

   jsval_to_int(cx, argv[0],&k);

    jsval ret =std_string_to_jsval(cx,buy(k));

   JS_SET_RVAL(cx, vp, ret);

    return true;

}

bool jsb_os_shareJiePingImg(JSContext *cx,uint32_t argc,JS::Value *vp){

   jsval *argv =JS_ARGV(cx, vp);

   JSStringWrapper pW(argv[0]);

   JSStringWrapper pW1(argv[1]);

   JSStringWrapper pW2(argv[2]);

   JSStringWrapper pW3(argv[3]);

   jsval ret =std_string_to_jsval(cx,shareJiePingImg(pW.get(),pW1.get(),pW2.get(),pW3.get()));

   JS_SET_RVAL(cx, vp, ret);

    return true;

}

bool jsb_os_getCurTime(JSContext *cx,uint32_t argc,JS::Value *vp){

   jsval *argv =JS_ARGV(cx, vp);

    jsval ret =std_string_to_jsval(cx,getCurTime());

   JS_SET_RVAL(cx, vp, ret);

    return true;

}

Map<std::string,JieGuaItem*> jieGuaMap;

string guaCi(string k){

    CCLOG("c++ guaCi:%s",k.c_str());

   if(jieGuaMap.size()<=0){

       constchar* file_path =FileUtils::getInstance()->fullPathForFilename("jiegua.xml").c_str();

        CCLOG("external file path = %s",file_path);

        XMLDocument* myDocment =newtinyxml2::XMLDocument();

#if (CC_TARGET_PLATFORM ==CC_PLATFORM_ANDROID)

       unsignedchar* pBuffer=NULL;

       int bufferSize=0;

        pBuffer=FileUtils::getInstance()->getFileData(file_path,"r",&bufferSize);

       if(pBuffer){

            myDocment->Parse((constchar*)pBuffer);

        }else{

            CCLOG("android读取xml失败!");

            CC_SAFE_DELETE(myDocment);

            CC_SAFE_DELETE(pBuffer);

           return"";

        }

#else

       //加载文件

        myDocment->LoadFile(file_path);

#endif

       tinyxml2::XMLElement* rootElement = myDocment->RootElement();

       XMLElement* studentElement = rootElement->FirstChildElement();

       while (studentElement) {

           auto item=newJieGuaItem();

            item->autorelease();

           string ss=studentElement->GetText();

           MyFun::string_replace(ss,"|","");

            item->setGuaCi(ss);

           jieGuaMap.insert(studentElement->Attribute("name"),item);

            studentElement = studentElement->NextSiblingElement();

        }

    }

   string str=jieGuaMap.at(k)->getGuaCi();

   return str;

}

string showWeb(string url,string data,Rect rect){

   CCLOG("showWeb:%s,%f",url.c_str(),rect.size.height);

   Android_Ios::getInstance()->showWeb(url,data,rect.origin.x,rect.origin.y,rect.size.width,rect.size.height);

   return" ";

}

string hideWeb(string s){

   CCLOG("hideWeb:%s",s.c_str());

    Android_Ios::getInstance()->hideWeb();

   return" ";

}

string checkNetWork(){//返回true的字符串或者fasle的字符串判断网络连接与否

    returnAndroid_Ios::getInstance()->checkNetWork();

}

string openSafari(string url){

    Android_Ios::getInstance()->openSafari(url);

   return" ";

}

string outStream(std::vector<std::string> data,std::vector<std::string> format){//参数:(消息,类型)

    //默认512字节

    OutPutStream* out=newOutPutStream;

   for(int i=0;i<format.size();i++){

       if(format[i].compare("int")==0){

            out->putInt(atoi((char*)data[i].c_str()));

        }elseif(format[i].compare("utf8")==0){

            out->putUTF8(data[i].c_str());

        }elseif(format[i].compare("short")==0){

            out->putShort(atoi((char*)data[i].c_str()));

        }else{

            CCLOG("%s","OutPutStream fail不能out的数据格式");

        }

    }

   string ss=out->endPutString();

    MyFun::shareMyFun()->xorString(ss);

   delete out;

    //加密的数据需进行编码否则跟js交互会出现丢失

   return ZCLBass64::Encode((unsignedchar*)ss.c_str(), ss.length());

}

vector<string> inStream(string data,vector<string> format){//参数:(加密的字符串,读取的格式

   int k=0;

    data=ZCLBass64::Decode(data.c_str(), data.length(),k);

    MyFun::shareMyFun()->xorString(data);

    InPutStream* in=newInPutStream(data);

    vector<string> ss;

   for(int i=0;i<format.size();i++){

       if(format[i].compare("int")==0){

           char buf[40];

           sprintf(buf,"%d",in->getInt());

            ss.push_back(buf);

        }elseif(format[i].compare("utf8")==0){

            ss.push_back(in->getUTF8());

        }elseif(format[i].compare("short")==0){

           char buf[40];

           sprintf(buf,"%d",in->getShort());

            ss.push_back(buf);

        }else{

            CCLOG("%s","OutPutStream fail不能out的数据格式");

        }

    }

   delete in;

   return ss;

}

string sheBeiNum(){

    returnAndroid_Ios::getInstance()->getSheBeiNum();

}

string showMsgBox(string msg){

   cocos2d::MessageBox(msg.c_str(),"");

   return"";

}

string buy(int type){

   Android_Ios::getInstance()->buy(type);

   return"";

}

string shareJiePingImg(string title,string content,string url,string name){

    string path=Android_Ios::getInstance()->getShareImgPath();

    path.append(name);

    Android_Ios::getInstance()->shareContent(title.c_str(),content.c_str(),url.c_str(),path.c_str());//FileUtils::getInstance()->fullPathForFilename("picName.png").c_str());

    Android_Ios::getInstance()->deleteShareImg(name.c_str());

   return"";

}

string getCurTime(){

    returnAndroid_Ios::getInstance()->getCurTime();

}

///c++调用js///

void os_jsb_phpEncrypt(string data){

   // string method="cpp_loginSucceed('"+name+"','"+pwd+"','"+nichen+"')";

    string method="cpp_phpEncrypt('"+data+"')";

   jsval ret;

   ScriptingCore::getInstance()->evalString(method.c_str(), &ret);

}

void os_jsb_iosIap(string productId){

   string method="cpp_iosIap('"+productId+"')";

   jsval ret;

   ScriptingCore::getInstance()->evalString(method.c_str(), &ret);

}

3。在 AppDelegate.cpp文件注册函数
  sc-> addRegisterCallback ( register_jsb_os_info );//register_jsb_os_info为.cpp文件中绑定js和c++函数的函数

本人里面包含了js和c++的各种参数调用,如String,int,以及cocos2d-x的一些对象 Rect等等。希望能帮助到后学。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值