1.创建Cocos2dx JS 项目 Cocos Console使用文档
1
|
cocos new -p com.package.client -l js -d ./ projectName
|
2.以下 项目目录 用${PROJECT} 代替 指的是你创建项目时 指定的路径
开始:
1,首先 你需要在 Sqlite3 下载 sqlite3.h sqlite3.c这两个基础文件(如果不高兴下载的话 后面我会把教程源码放上来)
2, 包装类选用 我在基于 wrapper 的基础上修改了包装类 加入平台初始化信息 主要是处理Android目录权限的问题了
3,复制以上文件至Classes目录下 在xcode中请加入至开发环境 Classes右键 Add Files To "${PROJECT_NAME}"
这个时候 你的目录结构应该是这样的
4,测试下是否正常吧
4.1 请自行编辑一个sqlite.db文件 或者可以把示例下载 获取 project/res/data.db 文件 放入${PROJECT} /res目录下
4.2 修改AppDelegate.cpp 在applicationDidFinishLaunching()里加入以下代码 需要在AppDelegate.cpp里include SQLiteWrapper.h
1
2
|
auto
wrapper =
new
SQLiteWrapper();
wrapper->initializing(
"data.db"
,
"res"
, "”);
|
4.3 运行项目吧
日志输出:
cocos2d: 数据库打开状态 1
恭喜你!! 不过还没完 下面是JSB
JSB准备:
* 参考文章 How to bind C++ to Javascript
* 上例部分仅供参考 也就是说有部分已经不对了 详情见下
1,下载 llvm-3.3 解压到 $HOME/bin 目录 没有bin自行创建.
2,下载安装MacPorts http://www.macports.org/install.php
3,python插件支持 如果你已经做了2 请直接在终端执行
1
|
sudo
port
install
python27 py27-yaml py27-cheetah
|
4,下载android-ndk-r9b
如果以上你执行完成了 并且放置的目录都清楚了 OK 下一步
JSB开始:
1,进入目录 ${PROJECT}/tools/bindings-generator/test
2,观察test例子 一起开始AUTO JSB吧
3,首先 建立目录 ${PROJECT}/tools/bindings-generator/test/sqlite_bindings 并复制SQLiteWrapper.h SQLiteWrapper.cpp sqlite3.h 至该目录 就是我们想要进行绑定的类啦
4,修改userconf.ini
至 ${PROJECT}/tools/bindings-generator/test目录 复制文件 userconf.ini.sample 并重命名为userconf.ini 修改userconf.ini 文件
1
2
3
4
5
|
androidndkdir=/path/to/android-ndk //你下载的ndk的路径
clangllvmdir=/path/to/clang+llvm-3.3 //你下载的llvm-3.3路径
cxxgeneratordir=${PROJECT}/tools/bindings-generator //这个你只需要指向到你的${PROJECT}/tools/bindings-generator目录下
|
5,修改user.cfg
至 ${PROJECT}/tools/bindings-generator/test 目录 复制文件 user.cfg.sample 并重命名为user.cfg 修改user.cfg 文件
1
|
PYTHON_BIN=/opt/local/bin/python //这里就是你的python安装目录里的python执行文件 which python目录也可
|
6, 修改ini文件 复制文件${PROJECT}/tools/bindings-generator/test/test.ini 粘贴并重命名 db.ini
下面是示例代码 请同仁注意 #后面中文的那些修改 然后改动至自己的db.ini上 偷懒直接用也没问题 本例中 如可 请用下面的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
[testandroid]
name = sqlite_binding
#
prefix = autogensqlitebindings
#后缀
classes = SQLiteStatement SQLiteWrapper
#绑定的类
android_headers = -I%(androidndkdir)s/platforms/android-14/arch-arm/usr/include -I%(androidndkdir)s/sources/cxx-stl/gnu-libstdc++/4.7/libs/armeabi-v7a/include -I%(androidndkdir)s/sources/cxx-stl/gnu-libstdc++/4.7/include
android_flags = -D_SIZE_T_DEFINED_
clang_headers = -I%(clangllvmdir)s/lib/clang/3.3/include
clang_flags = -nostdinc -x c++ -std=c++11
simple_test_headers = -I%(cxxgeneratordir)s/test/sqlite_binding
#头文件
extra_arguments = %(android_headers)s %(clang_headers)s %(android_flags)s %(clang_flags)s %(simple_test_headers)s %(extra_flags)s
headers = %(cxxgeneratordir)s/test/sqlite_binding/SQLiteWrapper.h
#头文件
target_namespace = sql
#命名空间 指定了在JS端调用需要加入命名空间才能调用
remove_prefix =
skip =
base_objects =
abstract_classes =
classes_have_type_info = no
rename =
rename_functions =
rename_classes =
# classes for which there will be no "parent" lookup
classes_have_no_parents =
# base classes which will be skipped when their sub-classes found them.
base_classes_to_skip =
# Determining whether to use script object(js object) to control the lifecycle of native(cpp) object or the other way around. Supported values are 'yes' or 'no'.
script_control_cpp = yes
|
7,复制 ${PROJECT}/tools/bindings-generator/test/test.sh 并重命名 db.sh 修改最后一行
1
|
LD_LIBRARY_PATH=${CXX_GENERATOR_ROOT}/libclang $PYTHON_BIN ${CXX_GENERATOR_ROOT}/generator.py ${CXX_GENERATOR_ROOT}/
test
/db.ini -t spidermonkey -s testandroid -o ./auto_sqlite_bindings
|
请注意 题主只修改了2个地方 一个指定db.ini 是generator.py 的入参 一个指定输出目录 -o ./auto_sqlite_bindings
8,执行db.sh文件
如果报错
Fatal Error: NDK r9b must be required! | 你可以手动export下 例如 export NDK_ROOT=${NDK r9b的目录} |
TranslationUnitLoadError: Error parsing translation unit. | 请检查ini文件 是否路径错误等等 |
9,如无错误 那么好 应该已经生成了JSB的文件了 你应该会看到下图 名字的信息 取决于你在db.ini prefix的定义
10,复制cpp hpp 文件到你的Classes目录下吧 快快
11,注册JSB支持
11.1 修改AppDelegate 类 引入
#include “autogensqlitebindings.hpp"
11.2 在AppDelegate 类 applicationDidFinishLaunching()方法中添加注册 注意排队哦
sc->addRegisterCallback(register_all_autogensqlitebindings);
12,OK 现在我们可以在js里面愉快的使用sqlite了 修改 app.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
|
var
HelloWorldLayer = cc.Layer.extend({
sprite:
null
,
ctor:
function
() {
//
// 1. super init first
this
._super();
//开始执行吧 少年们
//只有在native才需要进行复制
if
(!cc.sys.isNative){
cc.log(
"只能在Native下使用"
);
return
true
;
}
this
._db =
new
sql.SQLiteWrapper();
this
._dbPath =
this
._db.initializing(
"data.db"
,
"res"
,
""
);
this
._isOpen =
this
._db.open(
this
._dbPath);
cc.log(
"数据库打开结果:"
+
this
._isOpen?
"已打开..."
:
"未打开..."
);
if
(
this
._isOpen){
var
st =
this
._db.statement(
"select * from equip"
);
var
ary = [];
while
(st.nextRow()){
var
equipVO =
new
CEquipVO();
equipVO.wid = parseInt(st.valueString(0));
equipVO.name = st.valueString(1);
equipVO.desc = st.valueString(2);
equipVO.level = st.valueString(3);
equipVO.icon = st.valueString(4);
equipVO.quality = st.valueString(5);
ary.push(equipVO);
}
for
(
var
vo
in
ary){
cc.log(
"equipData:"
+ ary[vo].toString());
}
}
return
true
;
}
});
var
HelloWorldScene = cc.Scene.extend({
onEnter:
function
() {
this
._super();
var
layer =
new
HelloWorldLayer();
this
.addChild(layer);
}
});
var
CEquipVO = cc.Class.extend({
wid:
null
,
//like 10000001
name:
null
,
//like 银票
level:
null
,
//like 1
type:
null
,
//like 1
price:
null
,
//like 200
stackCount:
null
,
//like 99
bind:
null
,
//like 1
desc:
null
,
//like 加银两
quality:
null
,
//like 1
icon:
null
,
//like item/article/10000001.png
toString:
function
(){
return
this
.wid +
" "
+
this
.name +
" "
+
this
.level +
" "
+
this
.desc +
" "
+
this
.icon;
}
});
|
13,在IOS虚拟机上跑下吧 你能看到日志输出了哦
后语:
虽然我们在ios上实现了 但是 在android上 我们还是要进行修改
1,修改 ${PROJECT}/frameworks/runtime-src/proj.android/jni/Android.mk文件
1
2
3
4
5
|
LOCAL_SRC_FILES := hellojavascript/main.cpp \
../../Classes/sqlite3.c \
../../Classes/SQLiteWrapper.cpp \
../../Classes/autogensqlitebindings.cpp \
../../Classes/AppDelegate.cpp
|
2,你通过cocos compile -p android 编译后 使用Eclipse 愉快的调试吧
下图是我android上的调试哦
本教程主要是介绍JSB环境的使用 包括后面接入SDK的时候 等等都能跨端使用
下面是教程源码 您只需自己在本地创建项目 然后根据教程 覆盖资源
jsbcenter.zip (4221 K) 下载次数:257