由于Cocos2d-x支持多平台的开发,通常我们在自己熟悉下的平台进行开发完后,如果有需要,则在另一个平台下的IDE重新生成。
我经常在VS下进行完开发后才在Eclipse下重新生成APK,然后再Android手机上进行调试。然而在Eclipse下通过交叉编译生成APK时可能提示"DescriptionResourcePathLocationType"的错误。下面我来讲解如何解决这种错误的方法。
1.VS下包含头文件目录与Eclipse下包含头文件目录
在VS下,我们要包含头文件时可以使用"#include"xxx.h""语句来引用头文件,如果你已经把头文件放在Classes下,则不会出现找不到xxx.h的提示。如图1。
图1:
但是如果你引用的头文件是其他目录时,则会提示"Nosuchfileordirectory",如#include"cocos-ext.h",由于头文件cocos-ext.h在目录..\cocos2d\extensions下,没有加入到Classes,此时,我们要在项目属性中VC++目录中的包含目录中添加..\cocos2d\extensions就可以了,如图2。
图2:
那么在Eclipse下生成APK时如何包含头文件?
由于生成APK时,Eclipse需要的信息都填写在..\proj.android\jni下的Android.mk文件中,所以我们要打开此文件来修改文件信息。
打开此文件,我们会看到LOCAL_C_INCLUDES这个关键字样。根据《Androidbuildsystem&Android.mk》规范上的解析:LOCAL_C_INCLUDES--需要包含的头文件目录。所以我们把需要的头文件目录添加到此变量中就可以了。如图3。注意目录的分隔符是'/'而不是'\',因为'/'是unix下的规范。
图3:
在图3中,$(LOCAL_PATH)表示当前的路径,../表示回到上一级的目录。由于此Android.mk在E:\mycoscos2d\MyThiefTD\proj.android\jni,所以../../就回到了E:\mycoscos2d\MyThiefTD目录下,所以就可以包含cocos2d/extensions目录了。
通过这样,我们就可以随意包含头文件目录了。
2.VS下添加源文件与Eclipse下添加源文件
在VS下,我们把需要的cpp文件添加到Classes目录中就可以直接使用了。
那么在Eclipse下生成APK时如何指定所需要的cpp文件?
我们同样可以打开..\proj.android\jni下的Android.mk文件,可以看到LOCAL_SRC_FILES这个关键字样。根据《Androidbuildsystem&Android.mk规范》上的解析:LOCAL_SRC_FILES--编译的源文件,可以是.c,.cpp,.java,.S(汇编文件)或是.aidl等格式,不同的文件用空格隔开。如果编译目录子目录,采用相对路径,如子目录/文件名。也可以通过$(call目录),指明编译某目录下所有.c/.cpp/.java/.S/.aidl文件.追加文件LOCAL_SRC_FILES+=文件。
如果我们没有添加需要的cpp文件到LOCAL_SRC_FILES变量中,会产生错误提示”DescriptionResourcePathLocationTypeundefinedreferenceto'UIScene::createScene()'LevelScene.cpp/MyThiefTD/Classesline106C/C++Problem"等等,所以我们要把需要的cpp添加到LOCAL_SRC_FILES变量中如图4。
图4:
在图4中,../的解析和图3的解析一样,同上。
3.在VS和在Eclipse下添加模块
有时写代码时不是直接写出头文件的名称,而是写出目录/xxx.h,例如#include"extensions/ExtensionMacros.h"
这里的extensions代表的是目录。
如果是在VS中,则需要把extensions的父目录包含在项目属性中VC++目录中的包含目录中就可以了。如图5。
图5:
那么在Eclipse中又是如何做到相同的效果?
我们同样可以打开..\proj.android\jni下的Android.mk文件,可以看到LOCAL_WHOLE_STATIC_LIBRARIES和import-module这个两个关键字样和图6。
图6:
根据《Androidbuildsystem&Android.mk规范》上的解析LOCAL_WHOLE_STATIC_LIBRARIES--一个用于表示相应的库模块被用作为“整个档案”到链接程序的变量。当几个静态库之间有循环依赖关系的时候,通常是很有益的。注意,当用来编译一个动态库的时候,这将迫使你将所有的静态库中的对象文件添加到最终的二进制文件中。但生成可执行程序时,这是不确定的。所以我们要把cocos_extension_static库模块添加到LOCAL_WHOLE_STATIC_
LIBRARIES。
其实这还是不够的,我们还要通过import-module导入该模块的的Android.mk的。根据《Androidbuildsystem&Android.mk规范》上的解析import-module--一个允许你通过名字找到并包含另一个模块的的Android.mk的功能,例如$(callimport-module,<name>)这将会找到通过NDK_MODULE_PAT环境变量引用的模块<name>的目录列表,并且将其自动包含到Android.mk中。
也就是说LOCAL_WHOLE_STATIC_LIBRARIES作用是包含模块,import-module导入该模块的Android.mk,并且通过NDK_MODULE_PAT环境变量引用的模块<name>的目录列表,让程序搜索到extension目录。
由于..\proj.android\jni下的Android.mk已经把我们写好了,如图6中所示,但是它们之前有个#号,这是注释的作用。所以,我们把相应的#去掉就可以包含相对应的模块了,如图7。
图7:
最后,我们来看看$(callimport-module,extensions)对应模块cocos_extension_static的mk,此目录在..\cocos2d\extensions的Android.mk,如图8。
图8:
从图8中,我们可以看到目录..\cocos2d\extensions\Android.mk中的模块名称为cocos_extension_static,这和..\proj.android\jni\Android.mk中LOCAL_WHOLE_STATIC_LIBRARIES+=cocos_extension_static中的模块名称相同,这说明了$(callimport-module,<name>)通过name找到了对应目录下的mk。 如需转载,请标明出处:http://blog.csdn.net/cbbbc/article/details/39228155
我经常在VS下进行完开发后才在Eclipse下重新生成APK,然后再Android手机上进行调试。然而在Eclipse下通过交叉编译生成APK时可能提示"DescriptionResourcePathLocationType"的错误。下面我来讲解如何解决这种错误的方法。
1.VS下包含头文件目录与Eclipse下包含头文件目录
在VS下,我们要包含头文件时可以使用"#include"xxx.h""语句来引用头文件,如果你已经把头文件放在Classes下,则不会出现找不到xxx.h的提示。如图1。
图1:
但是如果你引用的头文件是其他目录时,则会提示"Nosuchfileordirectory",如#include"cocos-ext.h",由于头文件cocos-ext.h在目录..\cocos2d\extensions下,没有加入到Classes,此时,我们要在项目属性中VC++目录中的包含目录中添加..\cocos2d\extensions就可以了,如图2。
图2:
那么在Eclipse下生成APK时如何包含头文件?
由于生成APK时,Eclipse需要的信息都填写在..\proj.android\jni下的Android.mk文件中,所以我们要打开此文件来修改文件信息。
打开此文件,我们会看到LOCAL_C_INCLUDES这个关键字样。根据《Androidbuildsystem&Android.mk》规范上的解析:LOCAL_C_INCLUDES--需要包含的头文件目录。所以我们把需要的头文件目录添加到此变量中就可以了。如图3。注意目录的分隔符是'/'而不是'\',因为'/'是unix下的规范。
图3:
在图3中,$(LOCAL_PATH)表示当前的路径,../表示回到上一级的目录。由于此Android.mk在E:\mycoscos2d\MyThiefTD\proj.android\jni,所以../../就回到了E:\mycoscos2d\MyThiefTD目录下,所以就可以包含cocos2d/extensions目录了。
通过这样,我们就可以随意包含头文件目录了。
2.VS下添加源文件与Eclipse下添加源文件
在VS下,我们把需要的cpp文件添加到Classes目录中就可以直接使用了。
那么在Eclipse下生成APK时如何指定所需要的cpp文件?
我们同样可以打开..\proj.android\jni下的Android.mk文件,可以看到LOCAL_SRC_FILES这个关键字样。根据《Androidbuildsystem&Android.mk规范》上的解析:LOCAL_SRC_FILES--编译的源文件,可以是.c,.cpp,.java,.S(汇编文件)或是.aidl等格式,不同的文件用空格隔开。如果编译目录子目录,采用相对路径,如子目录/文件名。也可以通过$(call目录),指明编译某目录下所有.c/.cpp/.java/.S/.aidl文件.追加文件LOCAL_SRC_FILES+=文件。
如果我们没有添加需要的cpp文件到LOCAL_SRC_FILES变量中,会产生错误提示”DescriptionResourcePathLocationTypeundefinedreferenceto'UIScene::createScene()'LevelScene.cpp/MyThiefTD/Classesline106C/C++Problem"等等,所以我们要把需要的cpp添加到LOCAL_SRC_FILES变量中如图4。
图4:
在图4中,../的解析和图3的解析一样,同上。
3.在VS和在Eclipse下添加模块
有时写代码时不是直接写出头文件的名称,而是写出目录/xxx.h,例如#include"extensions/ExtensionMacros.h"
这里的extensions代表的是目录。
如果是在VS中,则需要把extensions的父目录包含在项目属性中VC++目录中的包含目录中就可以了。如图5。
图5:
那么在Eclipse中又是如何做到相同的效果?
我们同样可以打开..\proj.android\jni下的Android.mk文件,可以看到LOCAL_WHOLE_STATIC_LIBRARIES和import-module这个两个关键字样和图6。
图6:
根据《Androidbuildsystem&Android.mk规范》上的解析LOCAL_WHOLE_STATIC_LIBRARIES--一个用于表示相应的库模块被用作为“整个档案”到链接程序的变量。当几个静态库之间有循环依赖关系的时候,通常是很有益的。注意,当用来编译一个动态库的时候,这将迫使你将所有的静态库中的对象文件添加到最终的二进制文件中。但生成可执行程序时,这是不确定的。所以我们要把cocos_extension_static库模块添加到LOCAL_WHOLE_STATIC_
LIBRARIES。
其实这还是不够的,我们还要通过import-module导入该模块的的Android.mk的。根据《Androidbuildsystem&Android.mk规范》上的解析import-module--一个允许你通过名字找到并包含另一个模块的的Android.mk的功能,例如$(callimport-module,<name>)这将会找到通过NDK_MODULE_PAT环境变量引用的模块<name>的目录列表,并且将其自动包含到Android.mk中。
也就是说LOCAL_WHOLE_STATIC_LIBRARIES作用是包含模块,import-module导入该模块的Android.mk,并且通过NDK_MODULE_PAT环境变量引用的模块<name>的目录列表,让程序搜索到extension目录。
由于..\proj.android\jni下的Android.mk已经把我们写好了,如图6中所示,但是它们之前有个#号,这是注释的作用。所以,我们把相应的#去掉就可以包含相对应的模块了,如图7。
图7:
最后,我们来看看$(callimport-module,extensions)对应模块cocos_extension_static的mk,此目录在..\cocos2d\extensions的Android.mk,如图8。
图8:
从图8中,我们可以看到目录..\cocos2d\extensions\Android.mk中的模块名称为cocos_extension_static,这和..\proj.android\jni\Android.mk中LOCAL_WHOLE_STATIC_LIBRARIES+=cocos_extension_static中的模块名称相同,这说明了$(callimport-module,<name>)通过name找到了对应目录下的mk。 如需转载,请标明出处:http://blog.csdn.net/cbbbc/article/details/39228155