1:C++中调用js方法: 问题:ios中当用户通过home键将游戏转入后台时,调用js中的暂停游戏方法; AppDelegate::applicationDidEnterBackground() 和 applicationDidEnterForeground()方法是C++方式处理程序进入后台与前台的代码,在此处添加C++调用js的代码: //version 2.1.3 ScriptingCore* sc = ScriptingCore::getInstance(); jsval nsval; JS_GetProperty(sc->getGlobalContext(),sc->getGlobalObject(),"类名",&nsval); if(nsval != JSVAL_VOID) { sc->executeFunctionWithOwner(nsval,"方法名"); } js中(假设类名plus,方法名:onDidEnterBackground): var plus = {}; plus.onDidEnterBackground(){...//code here}; 备注: 使用executeFunctionWithOwner的关键是获取Owner,JS_GetProperty是spideMonkey提供的一种获取属性(也是对象)的方式; ========================================================= 2:js中调用C++方法: 定义C++方法,然后将编写绑定, 以在TableView下增加一个testjs方法为例, 我们在jsb_cocos2dx_extension_manual.cpp中添加代码: //add manual function to js static JSBool js_cocos2dx_CCTableView_testFuncTojs(JSContext* cx,uint32_t argc,jsval *vp) { if(argc > 0) { JSString *string = NULL; JS_ConvertArguments(cx,argc,JS_ARGV(cx,vp),"S",&string); if(string) { JSStringWrapper wrapper(string); CCLOG("jsb binding say: %s",wrapper.get().c_str()); } } return JS_TRUE; } 然后在register_all_cocos2dx_extenstion_manual(JSContext* cx,JSObject* global)末尾行添加一个定义: JS_DefineFunction(cx,tmpObj,"testFuncTojs",js_cocos2dx_CCTableView_testFuncTojs,1,JSPROP_READONLY|JSPROP_PERMANENT); 最后在js文件中即可调用: cc.TableView.testFuncTojs("hello,jsb!"); ========================================================= 3:C++调用obj-C 定义oc的.h和.m文件,定义方法: testLog 和 testMessageBox 定义c++的.h文件 定义c++的cpp文件,将后缀名改为.mm .mm文件混编写法如下: #include "supportOC.h" #include "invokeOC.h" void invokeOC::myinit(){ [supportOC testLog]; [supportOC testMessageBox:@"cocos2d-x调用oc" title:@"hello"]; } 之后在主程序中引入c++的.h文件后即可使用 invokeOC::myinit()方法; ========================================================= 4:C++和 Java的互调 制作安卓版本时,我们需要使用C++调用java的函数,这个通过jni实现,实例: 在头部引入文件: #include <jni.h> #include "platform/android/jniHelper.h" 然后定义C++方法: void callJavaFunc() { cocos2d::JniMethodInfo t; if(cocos2d::JniHelper::getStaticMethodInfo(t,"org/cocos2dx/项目名称/类名","java的方法","()V")) { t.env->CallStaticVoidMethod(t.classID,t.methodID); } } 在c++中调用callJavaFunc()方法或者绑定给js调用,然后使用NDK编译后在ADT中运行,即可调到java的方法; java调用C++的方法: 首先在java中定义一个public static native void funcname(); 然后运行时会调用C++中一定命名规则的funcname函数;命名如下: 复制代码 extern "C" { void Java_org_cocos2dx_项目名_类名_funcname(JNIEnv *env,jobject thiz) { CCLog("jni : java call C++ "); } } 复制代码 注意这里一定要extern "C",不然java无法找到这个native方法; =========================================================