ps:小弟最近在学习cocos2dx,不懂C++,不懂android,就有点java基础,自己照书敲了一个HelloWorld,可是编译遇到各种问题,各种不会的,现在就把我这几天来做个总结了,希望各位大大看到,能对你们有帮助...
首先我们在vs里面写好了一个cocos2dx项目,运行没有问题的时候,就想要把它移植到android平台或ios平台,android平台和ios平台和我们写代码这个平台是不一样的,首先系统就不一样的,那就想到所谓的"交叉编译“。(交叉编译:就是在一个平台上生成另一个平台上的可执行代码。这里需要注意的是所谓 平台,实际上包含两个概念:体系结构(Architecture)、操作系统(Operating System)。) 有了这个想法就得去做了,我想移植到 android平台上,那我得把工作环境搭好,然后新建一个android项目,项目建好了,就得通过ndk进行编译了,编译的复杂的就是创建builder,我们通过这个builder去把帮我们编译的东东组装起来,来编译我们在vs中写的cocos2dx中的代码。(关于builder疑问,请大概看下builder设计模式)
builder这个工具好了,这时我们就可以通过它去编译我们的C++代码了,可是这里还需要告诉它如何编译,那就要Android.mk这个描述文件,builder根据这个描述就可以知道怎么编译我们写的C++代码。(.mk文件:首先你要知道它是一个Makefile文件,可以把Makefile文件理解成一个编译配置文件,它保存着如何编译的配置信息,即指导编译器如何来编译程序,并决定编译的结果是什么。)这些都搞好了,那只欠东风了,运行开始编译了。编译后生成了个.so文件,这个.so文件个人觉得就是我们那些C++代码的,原因是,android核心是Linux系统,而这个.so文件就跟.dll文件差不多.一般来说.so文件就是常说的动态链接库, 都是C或C++编译出来的。与Java比较就是:它通常是用的Class文件(字节码),还有Linux下的.so文件时不能直接运行的,一般来讲,.so文件称为共享库,最重要的一点是,我们这个项目的java类activity里面有一句System.loadLibrary("库名");加载我们这个库,细心的大大们也许觉得库名跟我们生成的库名字不一样,少了一个lib前缀,这个也是有原因的,看下面一段话:
Android
——您的应用程序的源代码将声明一个或多个方法通过实施以本机关键字,指示本机代码。
例如:native
——你必须提供一个本地共享库,包含了这些方法的实现,它将被打包到你应用程序中。这个库必须根据标准
Unix约定 lib<something>.so。所以,应当包含一个标准的JNI入口点(稍后说明)。
例如:libFileLoader.so
——您的应用程序必须显式地加载库。例如,在应用程序启动的时候加载它,只需添加以下其源代码:
static {
注意,不要lib和.so作为前缀和后缀。
呵呵,大大们应该理解了,关于库名的名字,当初我也有一个疑问,就是Android.mk里面有一个LOCAL_MODULE 和一个LOCAL_MODULE_FILENAME,到底哪一个是库名呢?我又问又找,终于搞明白了,下面是解释: