以前也写过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__) */
//
// 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);
}