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.so
include $(CLEAR_VARS)
LOCAL_MODULE := libiconv
LOCAL_CFLAGS := \
  -Wno-multichar \
  -DAndroid \
  -DLIBDIR="c" \
  -DBUILDING_LIBICONV \
  -DIN_LIBRARY

LOCAL_SRC_FILES := \
  libcharset/lib/localcharset.c \
  lib/iconv.c \
  lib/relocatable.c

LOCAL_C_INCLUDES += \
  $(LOCAL_PATH)/include \
  $(LOCAL_PATH)/libcharset \
  $(LOCAL_PATH)/lib \
  $(LOCAL_PATH)/libcharset/include \
  $(LOCAL_PATH)/srclib
include $(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_static

LOCAL_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 更改为#include "../../iconv/include/iconv.h"意思就是去包含到iconv.h这个头文件。继续编译。

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 更改为#include "../proj.android/libs/cocos2dx/platform/third_party/ios/curl/curl.h"。继续编译

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查找。


你可能感兴趣的:(跨平台,android,coocs2d-x,C++,Cocos2d-x,android,android开发)