最近在做一件事,就是把java的sdk的接口已lua的形式,导出去给游戏部门使用。游戏部门用的cocos-2dx-Lua开发,而根据了解可以知道luaApi中只有一个api方法可以调用java的静态方法,这在项目中是远远不够的,因此要使用C++作为中间层来调度。
因此这样的一个调度模式,其中涉及的知识点颇多的,现在先记录一下,回头再把这些知识点都说明一下。
1.cocos-2dx IDE 开发环境配置 ,vs2013,Luastudio,Eclipse
1.1 IDE可以去cocos官网下载
1.2 Luastudio 下载使用是为了学习Lua的语法基础,总比配置复杂的环境变量好。不过安装这个我也花了好长时间,主要是找它的下载比较麻烦。
Luastudio 下载地址。
1.3 vs2013 因为cocos-lua中也包含了C++的代码,为了更好的做调试,vs2013必不可少,事实证明,真的十分需要这个vs2013,仅仅依靠IDE去开发远远不够的。
vs2013旗舰版 下载地址
这个并非破解版,因此如果需要注册码的话可以私信一下我。
1.4 Eclipse 主要是用来android工程的开发,当然,使用android studio也可以,但是studio还处于一个不稳定的阶段,Eclipse 相对稳定性好很多。奇葩问题少点。
2.Lua语法
2.1 lua语法并不难 是一种类似于js的一种动态语言脚步
2.2 建议先从lua基础看起,再去看cocos官网的lua游戏教程,会收获不少。
Lua语法基础
3.IDE中Lua工程的项目结构
3.1 cocos-2dx 作为一个可以开发多平台产品的工具,当然有着复杂的项目结构,如果需要构建win32或者android 又或者是ios的app的时候,就需要了解一下他们的结构。
3.2 关键的看几点: 1,framwork文件夹 2.src文件夹 3.各种在工程目录下的属性文件 4. framwork下的run-time工程
4.Lua绑定C++类
4.1 折腾了我一个礼拜的东西,可以查看我上两编博客。
4.2 也可以参考cocos本来绑定的方式。通过luaL_openlib绑定一个方法到Lua中去
5.C++类加入编译库
5.1 关于C++库的编译 了解mk文件的各大属性名称。
6.编译文件.mk的使用
--------静态库的链接
--------x86等库的生成
7.动态库与静态库编译时的链接
——函数可以多次声明但只能被定义一次
这就解释到为何加入on_Load时无法编译o
8.jni编码注意事项,env与全局变量 和 static的使用
8.1 因为我使用的流程是如下:
Lua—->C++—–>Java
Lua<—-C++<—–Java
我们都知道,java与C++互相调用的时候,是使用jni,而jni的使用时依赖与env指针和当前java调用的对象thiz的。
例如:
在java层的代码:
parkage com.park.java.native
class A
public int native add(int a , int b );
public void plus(int c , int d){
Log.d (“TAG”,”c+d = “+ (c+d));
}
其对应的C层代码就为:
…….JNI_CALL jint com_park_java_native_add(
Jvn* evn , jobject thiz,int a,int b){
}
如果我再想在C层代码中或者C++中调用这个classA的plus方法,就必须要等到evn,和这个A的对象 thiz,如果不保存这两者,特别是后者的话,又一次通过jni方法new一个新对象的话,就会又多出了一个class A的对象了。这是其一的问题。
其二,回到上面的调用流程,Lua调用c++再调用java这个步骤来,Lua调用C++是不会带有env指针的,而没有这个指针,C++是无法调用Java的,所以应当在Lua调用C++再调用java之前,把这个env指针缓存起来。
但是我们知道,env是java虚拟机分配的一个线程指针,这个指针只能在产生它的线程中使用,不能跨线程运用,否则会出错,而C++调用java难以保证是和java调用C++时同一线程,因此env不应该保存为一个全局变量来缓存起来。
这个时候,javaVM出现了。
------静态对静态 动态对动态的编译原则
------env与obj的全局获取
------onLoad函数可以先注册本地函数
-----exterm "C"的作用
9.C++的单例模式,及C++的语法习惯
10.C++的回调函数使用,callback函数,函数指针。
——命名空间的作用
——什么是函数指针
——怎么定义一个函数指针
——函数指针使得函数可以作为一个变量的形式,传递到函数中去。
——typedef的定义说明
——函数声明与定义分离
——-函数模板的使用
11.待续。。。
暂时遇到的以上10个对于一个小白来说有难度的知识点,每个知识点都能折磨你个一到2天的时间。