Skip to content

Commit 0c2e4cc

Browse files
committed
cocos2d-js 3.0 jsb环境调用底层Objective-C代码
1 parent 894916a commit 0c2e4cc

File tree

1 file changed

+133
-0
lines changed

1 file changed

+133
-0
lines changed

ios-jsb.md

Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
# cocos2d-js 3.0 jsb环境调用底层Objective-C代码
2+
3+
------
4+
5+
## 1. 注册jsb函数
6+
7+
------
8+
9+
比android要简单,因为Xcode可以C++和Objective-C混编的。环境升级到cocos2d-js 3.0 rc0,准备给javascript加一个osInfo的函数,来判断用户的系统信息以及网络信息。
10+
11+
首先在项目目录下的frameworks/runtime-src/Classes/目录添加jsb_ios_info.h的头文件,内容如下:
12+
13+
```c
14+
#include "cocos2d_specifics.hpp"
15+
#include "cocos2d.h"
16+
17+
#import "sys/sysctl.h"
18+
19+
std::string os_info();
20+
bool jsb_os_info(JSContext *cx, uint32_t argc, JS::Value *vp);
21+
void register_jsb_os_info(JSContext* cx, JSObject* obj);
22+
```
23+
24+
增加jsb_ios_info.mm文件,内容如下:
25+
26+
```c
27+
#include "jsb_ios_info.h"
28+
29+
std::string os_info() {
30+
size_t size;
31+
int nR = sysctlbyname("hw.machine", NULL, &size, NULL, 0);
32+
char *machine = (char *)malloc(size);
33+
nR = sysctlbyname("hw.machine", machine, &size, NULL, 0);
34+
NSString *platform = [NSString stringWithCString:machine encoding:NSUTF8StringEncoding];
35+
free(machine);
36+
37+
if ([platform isEqualToString:@"iPhone1,1"]) {
38+
platform = @"iPhone";
39+
} else if ([platform isEqualToString:@"iPhone1,2"]) {
40+
platform = @"iPhone 3G";
41+
} else if ([platform isEqualToString:@"iPhone2,1"]) {
42+
platform = @"iPhone 3GS";
43+
} else if ([platform isEqualToString:@"iPhone3,1"]||[platform isEqualToString:@"iPhone3,2"]||[platform isEqualToString:@"iPhone3,3"]) {
44+
platform = @"iPhone 4";
45+
} else if ([platform isEqualToString:@"iPhone4,1"]) {
46+
platform = @"iPhone 4S";
47+
} else if ([platform isEqualToString:@"iPhone5,1"]||[platform isEqualToString:@"iPhone5,2"]) {
48+
platform = @"iPhone 5";
49+
}else if ([platform isEqualToString:@"iPhone5,3"]||[platform isEqualToString:@"iPhone5,4"]) {
50+
platform = @"iPhone 5C";
51+
}else if ([platform isEqualToString:@"iPhone6,2"]||[platform isEqualToString:@"iPhone6,1"]) {
52+
platform = @"iPhone 5S";
53+
}else if ([platform isEqualToString:@"iPod4,1"]) {
54+
platform = @"iPod touch 4";
55+
}else if ([platform isEqualToString:@"iPod5,1"]) {
56+
platform = @"iPod touch 5";
57+
}else if ([platform isEqualToString:@"iPod3,1"]) {
58+
platform = @"iPod touch 3";
59+
}else if ([platform isEqualToString:@"iPod2,1"]) {
60+
platform = @"iPod touch 2";
61+
}else if ([platform isEqualToString:@"iPod1,1"]) {
62+
platform = @"iPod touch";
63+
} else if ([platform isEqualToString:@"iPad3,2"]||[platform isEqualToString:@"iPad3,1"]) {
64+
platform = @"iPad 3";
65+
} else if ([platform isEqualToString:@"iPad2,2"]||[platform isEqualToString:@"iPad2,1"]||[platform isEqualToString:@"iPad2,3"]||[platform isEqualToString:@"iPad2,4"]) {
66+
platform = @"iPad 2";
67+
}else if ([platform isEqualToString:@"iPad1,1"]) {
68+
platform = @"iPad 1";
69+
}else if ([platform isEqualToString:@"iPad2,5"]||[platform isEqualToString:@"iPad2,6"]||[platform isEqualToString:@"iPad2,7"]) {
70+
platform = @"ipad mini";
71+
} else if ([platform isEqualToString:@"iPad3,3"]||[platform isEqualToString:@"iPad3,4"]||[platform isEqualToString:@"iPad3,5"]||[platform isEqualToString:@"iPad3,6"]) {
72+
platform = @"ipad 3";
73+
}
74+
75+
NSString *info = [NSString stringWithFormat:@"%@|%@", platform, [UIDevice currentDevice].systemVersion];
76+
77+
std::string *str = new std::string([info UTF8String]);
78+
79+
return *str;
80+
}
81+
82+
bool jsb_os_info(JSContext *cx, uint32_t argc, JS::Value *vp) {
83+
jsval ret = std_string_to_jsval(cx, os_info());
84+
JS_SET_RVAL(cx, vp, ret);
85+
86+
return true;
87+
}
88+
89+
void register_jsb_os_info(JSContext *cx, JSObject *obj) {
90+
JS_DefineFunction(cx, obj, "osInfo", jsb_os_info, 0, 0);
91+
}
92+
```
93+
94+
然后修改同目录下AppDelegate.cpp文件,添加相应的引用和注册javascript函数:
95+
96+
```c
97+
...
98+
#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
99+
#include "jsb_ios_info.h"
100+
#endif
101+
...
102+
sc->addRegisterCallback(register_jsb_os_info);
103+
104+
#if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID)
105+
sc->addRegisterCallback(JavascriptJavaBridge::_js_register);
106+
#endif
107+
sc->start();
108+
...
109+
```
110+
111+
最后在Xcode的Classes目录添加jsb_ios_info.h和jsb_ios_info.mm这两个文件,编译后就可以在js端调用osInfo这个函数了。
112+
113+
## 2. javascript端执行效果
114+
115+
------
116+
117+
用javascript的osInfo函数返回大概是这样的:
118+
119+
```
120+
iPhone 4S|7.1.2
121+
```
122+
123+
整个过程比android简单的多。
124+
125+
## 3. 反射机制调用
126+
127+
------
128+
129+
在写android jsb文档的时候,提到ios有没有像android那样的反射机制调用,结果昨天看到cocos2d-js的github合并了一个新功能,就是反射机制调用Objective-C:
130+
131+
https://github.com/cocos2d/cocos2d-js/pull/574
132+
133+
有兴趣的童鞋可以试一下,但个人觉得意义不是很大,因为Xcode支持C++和Objective-C混编,反射机制在ios jsb情况下省不了什么的工作量。

0 commit comments

Comments
 (0)