cocos2d-js 3.0 jsb环境调用底层Objective-C代码

github有格式文档:
https://github.com/faint2death/cocos2d-js/blob/master/ios-jsb.md

  1. 注册jsb函数

比android要简单,因为Xcode可以C++和Objective-C混编的。环境升级到cocos2d-js 3.0 rc0,准备给javascript加一个osInfo的函数,来判断用户的系统信息以及网络信息。

首先在项目目录下的frameworks/runtime-src/Classes/目录添加jsb_ios_info.h的头文件,内容如下:

#include “cocos2d_specifics.hpp”
#include “cocos2d.h”

#import “sys/sysctl.h”

std::string os_info();
bool jsb_os_info(JSContext cx, uint32_t argc, JS::Value vp);
void register_jsb_os_info(JSContext
cx, JSObject
obj);
增加jsb_ios_info.mm文件,内容如下:

#include “jsb_ios_info.h”

std::string os_info() {
size_t size;
int nR = sysctlbyname(“hw.machine”, NULL, &size, NULL, 0);
char *machine = (char *)malloc(size);
nR = sysctlbyname(“hw.machine”, machine, &size, NULL, 0);
NSString *platform = ;
free(machine);

if () {
    platform = @"iPhone";
} else if () {
    platform = @"iPhone 3G";
} else if () {
    platform = @"iPhone 3GS";
} else if (||||) {
    platform = @"iPhone 4";
} else if () {
    platform = @"iPhone 4S";
} else if (||) {
    platform = @"iPhone 5";
}else if (||) {
    platform = @"iPhone 5C";
}else if (||) {
    platform = @"iPhone 5S";
}else if () {
    platform = @"iPod touch 4";
}else if () {
    platform = @"iPod touch 5";
}else if () {
    platform = @"iPod touch 3";
}else if () {
    platform = @"iPod touch 2";
}else if () {
    platform = @"iPod touch";
} else if (||) {
    platform = @"iPad 3";
} else if (||||||) {
    platform = @"iPad 2";
}else if () {
    platform = @"iPad 1";
}else if (||||) {
    platform = @"ipad mini";
} else if (||||||) {
    platform = @"ipad 3";
}

NSString *info = .systemVersion];

std::string *str = new std::string();

return *str;

}

bool jsb_os_info(JSContext *cx, uint32_t argc, JS::Value *vp) {
jsval ret = std_string_to_jsval(cx, os_info());
JS_SET_RVAL(cx, vp, ret);

return true;

}

void register_jsb_os_info(JSContext *cx, JSObject *obj) {
JS_DefineFunction(cx, obj, “osInfo”, jsb_os_info, 0, 0);
}

然后修改同目录下AppDelegate.cpp文件,添加相应的引用和注册javascript函数:


#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
#include “jsb_ios_info.h”
#endif

sc->addRegisterCallback(register_jsb_os_info);

#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
sc->addRegisterCallback(JavascriptJavaBridge::_js_register);
#endif
sc->start();

最后在Xcode的Classes目录添加jsb_ios_info.h和jsb_ios_info.mm这两个文件,编译后就可以在js端调用osInfo这个函数了。

  1. javascript端执行效果

用javascript的osInfo函数返回大概是这样的:

iPhone 4S|7.1.2
整个过程比android简单的多。

  1. 反射机制调用

在写android jsb文档的时候,提到ios有没有像android那样的反射机制调用,结果昨天看到cocos2d-js的github合并了一个新功能,就是反射机制调用Objective-C:

https://github.com/cocos2d/cocos2d-js/pull/574

有兴趣的童鞋可以试一下,但个人觉得意义不是很大,因为Xcode支持C++和Objective-C混编,反射机制在ios jsb情况下省不了什么的工作量。

感谢楼主分享 :867: