ndk完整编译cocos2dx项目总结
Colin-Liao 个人原创,欢迎转载,转载请注明地址。Colin-Liao的专栏地址http://blog.csdn.net/focusdeveloper
之前已经写了如何创建android项目,然后导入到ADT中运行。
现在要将自己的项目运行到android中,总结下遇到的问题。先把所有要用到的头文件原文件都拷贝到proj.adroid/classes文件夹中。然后用终端编译build_native.sh。这里就出问题了:
1. HelloWorldScene.h: No such file or directory. 因为我之前已经把classes文件夹中的删除然后加入了自己的文件,而在jin/hellocpp文件夹中的main.cpp中却包含了
#include "HelloWorldScene.h"这个头文件,把他改为你将运行的第一个场景,也就是appdelegate.cpp中run的第一个场景。我这里改为#include "WaitScene.h"。
2.这里因为我们要编译所有classes中的文件,不可能一个一个去加入原文件。更改jin文件夹下面的android.mk,改为LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := game_shared LOCAL_MODULE_FILENAME := libgame FILE_LIST := hellocpp/main.cpp FILE_LIST += $(wildcard $(LOCAL_PATH)/../../Classes/*.cpp) FILE_LIST += $(wildcard $(LOCAL_PATH)/../../Classes/*.h) LOCAL_SRC_FILES := $(FILE_LIST:$(LOCAL_PATH)/%=%) LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../Classes LOCAL_WHOLE_STATIC_LIBRARIES := cocos2dx_static cocosdenshion_static cocos_extension_static include $(BUILD_SHARED_LIBRARY)$(call import-module,CocosDenshion/android) \$(call import-module,cocos2dx) \$(call import-module,extensions)
这里把所有classes中的头文件原文件全部参与编译。改好之后重新编译 3.iconv.h: No such file or directory.这里是找不到icon这个库(这一步比较麻烦)首先去官网http://ftp.gnu.org/pub/gnu/libiconv/下载icovn库.我把他放到了和COCOS2DX_ROOT同一级的目录下。并将其名字改为iconv文件夹。然后在iconv文件夹中新建一个Android.mk文件,内容为:
LOCAL_PATH:= $(call my-dir)#libiconv.soinclude $(CLEAR_VARS)LOCAL_MODULE := libiconvLOCAL_CFLAGS := \ -Wno-multichar \ -DAndroid \ -DLIBDIR="c" \ -DBUILDING_LIBICONV \ -DIN_LIBRARYLOCAL_SRC_FILES := \ libcharset/lib/localcharset.c \ lib/iconv.c \ lib/relocatable.cLOCAL_C_INCLUDES += \ $(LOCAL_PATH)/include \ $(LOCAL_PATH)/libcharset \ $(LOCAL_PATH)/lib \ $(LOCAL_PATH)/libcharset/include \ $(LOCAL_PATH)/srclibinclude $(BUILD_STATIC_LIBRARY)
现在要更改jin下的android.mk文件与问题2中的mk相比 LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../Classes \LOCAL_C_INCLUDES += \$(LOCAL_PATH) /../../../iconv/include \$(LOCAL_PATH) /../../../iconv/libcharset \$(LOCAL_PATH) /../../../iconv/lib \$(LOCAL_PATH) /../../../iconv/libcharset/include \$(LOCAL_PATH) /../../../iconv/srclib \$(LOCAL_PATH) /../../../iconv LOCAL_WHOLE_STATIC_LIBRARIES := cocos2dx_static cocosdenshion_static cocos_extension_static iconv_staticLOCAL_WHOLE_STATIC_LIBRARIES += libiconv include $(BUILD_SHARED_LIBRARY)$(call import-module,CocosDenshion/android) \$(call import-module,cocos2dx) \$(call import-module,extensions) \$(call import-module,iconv)
完成之后把你的文件中的#include 4.exception handling disabled, use -fexceptions to enable和'...' handler must be the last handler for its try block [-fpermissive]意思是没有开启异常处理。在jin文件下android.mk和Application.mk中分别加入LOCAL_CPPFLAGS += -fexceptions这句话。继续编译。
5.fatal error: curl.h: No such file or directory 这个文件找不到。在iOS工程项目下libs下的cocos2dx文件拷贝到android项目的libs文件夹下(这个文件自由放置,只要代码能够找到)然后在文件中将#include
6.把项目导入然后运行到手机上之后发现不能联网,但是wifi是打开的。找到android项目上的AndroidManifest.xml文件,然后选中permissions,add一个uses permission,name为android.permission.INTERNET。重新运行能够联网
7.我们的资源文件都是导入到assets这个文件夹下面,而每次编译build_native.sh的时候加入的文件又不见了,这里需要更改build_native.sh文件,将其中
# make sure assets is exist#if [ -d "$APP_ANDROID_ROOT"/assets ]; then# rm -rf "$APP_ANDROID_ROOT"/assets#fi
这段话注释起来。 8.在android上文件调用是没有问题的,只要把文件放入到了assets文件夹下,同样可以放入多层文件夹,只要调用路径正确。但是像xml.ini这样的文件一定是会出错的。必须先用CCFileUtils::sharedFileUtils()->fullPathForFilename(), 获取正确路径; CCFileUtils::sharedFileUtils()->getFileData(),解压,将文件读出到内存,程序直接处理这个返回值。若用fstream在android中是无法打开 zip文件的。我的实现为
unsigned long a = 0; std::string str = CCFileUtils::sharedFileUtils()->fullPathForFilename(ch); unsigned char* ch1 = CCFileUtils::sharedFileUtils()->getFileData(str.c_str(), "r", &a); std::string str1; char* ch2 = (char*)ch1; str1.assign(ch2); std::istringstream fs(str1); string s; int horizontal = 0; while (std::getline(fs, s,'\n')) { }
然后这就是在其中遇到的问题,之后还有问题再补充上。 如果想要在android项目下调用CCFileUtils::sharedFileUtils() ->getWritablePath();此路径,那么必须在主线程中调用,在子线程中调用将得不到路径。
cocos2dx的其他跨平台问题可以http://iskyc.com查找。
更多相关文章
- Qt平台下OpenCV for Android库的顺序
- 剖析andriod联系人
- Android加载SVG实现交互式地图绘制
- Android(安卓)截图实现(2)
- 经典Android试题及答案
- Android(安卓)发送HTTP GET POST 请求以及通过 MultipartEntityB
- android中apk反编译
- Android将多个视频文件拼接为一个文件
- [Android] 单独编译生成boot.img时mkbootfs: No such file or di