cocos2dx-jsb 跨语言调用

本文详细介绍了在iOS应用中如何使用C++调用JavaScript方法及JavaScript调用C++方法的技术,包括如何在C++中获取并执行JavaScript对象的函数,以及如何在JavaScript中绑定并调用C++方法,并提供了实例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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方法;
### 解决方案 在开发过程中遇到 `ScriptEngine onGetStringFromFile` 报错提示文件缺失的情况,通常是因为某些必要的 JavaScript Binding (JSB) 文件未能正确加载或路径配置不正确。以下是针对该问题的具体分析和解决方案: #### 1. **确认 JSB 文件是否存在** 如果报错显示缺少特定文件(如 `jsb_prepare.js`),需先检查项目中是否确实存在此文件。根据描述,在 Cocos2d-x 的旧版本中有此类文件[^1],但在新版本可能已被移除或替换。 - 如果使用的是较新的 Cocos Creator 或 Cocos2d-JS 版本,则需要重新生成绑定脚本。 - 使用命令行工具进入 `cocos2d-js/tools/tojs` 目录并执行以下命令来生成绑定脚本: ```bash python genbindings.py ``` 此操作会基于当前项目的设置自动生成所需的 JSB 绑定文件[^4]。 #### 2. **调整资源加载路径** 当尝试读取文件失败时,可能是由于路径配置错误所致。可以通过以下方式验证路径是否正确: - 获取可写入路径并通过调试打印其值: ```javascript var writablePath = jsb.fileUtils.getWritablePath(); cc.log("Writable Path:", writablePath); ``` - 确认目标文件所在的实际位置,并将其复制至上述路径下的子目录中。例如: ```javascript var targetFilePath = writablePath + "jsb/"; jsb.fileUtils.createDirectory(targetFilePath); ``` - 将必要文件手动放置于指定路径下后再调用加载逻辑[^2]。 #### 3. **初始化脚本顺序校正** 有时即使文件存在于预期路径上仍无法正常加载,这通常是因初始化阶段未按正确顺序引入依赖项所引起。可以参照如下代码片段确保基础库优先被解析: ```cpp // frameworks\runtime-src\proj.win32\main.cpp 中适当位置加入以下内容以保障核心功能可用性 std::string startSceneName = ""; if (!startSceneName.empty()) { auto director = Director::getInstance(); Scene* scene = nullptr; // 加载全局性的预处理函数 ScriptingCore *sc = ScriptingCore::getInstance(); sc->addRegisterCallback(register_all_cocos2dx_js_extensions); sc->addRegisterCallback(register_all_cocos2dx_ui_manual); } ``` 以上更改有助于稳定启动流程中的各项组件注册过程[^5]。 #### 4. **创建全新模板工程对比差异** 为了排除个别配置失误带来的干扰因素,建议新建一个标准样例程序并与现有项目做细致比较找出潜在区别之处。利用官方提供的一键生成器快速搭建框架结构作为参考依据: ```bash ./cocos new TestProject -p com.test.project -l js -d ./test/ ``` 通过这种方式获得的基础架构往往更加贴近最佳实践指南[^3]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值