cocos2dx 打包android遇到的问题和解决方法

6.5~6.15这一段时间,自己将去年实习期间做的单机斗地主,重新写了一次,主要是修改界面(增加大厅),修改代码结构(界面和游戏逻辑解耦),还存在一些BUG,日后有时间再做修复,工程地址:https://github.com/Kocola/DouDiZhu-v2.0

在最后将工程打包成android安装包时,遇到了很多的问题,这里做一个简单的记录(本来上周就应该记录的,无奈事情太多).

1.android.mk文件中,需要将自定义的所有类文件(.h和.cpp)放到LOCAL_SRC_FILES中,这样不仅效率低下,而且容易出错;

解决方法:

LOCAL_SRC_FILES := hellocpp/main.cpp \
                   ../../Classes/AppDelegate.cpp \
                   ../../Classes/HelloWorldScene.cpp

修改成:

define walk
$(wildcard $(1)) $(foreach e, $(wildcard $(1)/*), $(call walk, $(e)))
endef

#遍历Classes目录
ALLFILES = $(call walk, $(LOCAL_PATH)/../../Classes)

FILE_LIST := hellocpp/main.cpp
#从所有文件中提取出所有的.cpp和.c文件
FILE_LIST += $(filter %.cpp %.c, $(ALLFILES))

LOCAL_SRC_FILES := $(FILE_LIST:$(LOCAL_PATH)/%=%)

一遍看过来大概可以清楚这段代码的意思,由于对这个没有接触,仅仅是在看书(< < cocos2d-x 3.x 游戏开发之旅 > >)中学习到的;

2.VS2013编译通过的C++代码,在NDK编译时,会出现很多Error;

解决方法:将C++代码编译成.a文件,是使用NDK来编译的,NDK编译相对严格,例如将局部变量的地址作为参数传入函数,在VS2013中没有问题,可是在NDK编译过程就会报ERROR,这个只能对照着编译日志,一个个做修改;

3.使用libiconv库,在NDK编译时,一直报”No such files”类似的错误,即使路径正确也没有用;

解决方法:
在这个问题上纠缠了很久,通过修改路径的方法都试过了,无一例外都没用,最后的解决方法是,
将默认android.mk文件中的如下代码:

LOCAL_C_INCLUDES := $(LOCAL_PATH)/../../Classes

LOCAL_STATIC_LIBRARIES := cocos2dx_static

include $(BUILD_SHARED_LIBRARY)

$(call import-module,.)

修改为:

LOCAL_STATIC_LIBRARIES := cocos2dx_static

LOCAL_WHOLE_STATIC_LIBRARIES := android_support

include $(BUILD_SHARED_LIBRARY)

$(call import-module,.)
$(call import-module,Android/support)

即引入Android的support模块,其包含libiconv这个库,通过这种办法,终于没有再出现问题,而之前的问题,自己没有继续深入,猜测是由于自己路径没有设置正确,导致NDK无法找到指定的文件.

该解决方法参考链接:
http://blog.csdn.net/tspangle/article/details/41680583

3.NDK版本只能使用r9d,不然会一直出现错误,”make (e=2): 系统找不到指定的文件。”
r9d下载可见如下链接:http://blog.csdn.net/elesos/article/details/52913259

4.JNI DETECTED ERROR IN APPLICATION: input is not valid Modified UTF-8: illegal continuation byte 0xed,该错误的原因是,我在使用cocos2d::LabelTTF时,设置的字体为”微软雅黑”,但cocos2d-x中CCLableTTF中设置字体最好用系统默认的“Arial”,否则每次setString(),都会宕机(android5.0以上的 系统才会出现),
例如:
cocos2d::LableTTF::create(“test”,”微软雅黑”,24);中的微软雅黑修改成Arial

该解决办法参考链接:
http://blog.csdn.net/cwn0812/article/details/51775366

  1. error: undefined reference to ‘cocos2d::PluginJniHelper::setJavaVM(_JavaVM*)’

解决方法:
在你游戏工程下,将cocos2d\cocos\platform\android路径下的javaactivity-android.cpp文件打开,删除PluginJniHelper::setJavaVM(vm);即可

6.适配问题,如下图:
cocos2dx 打包android遇到的问题和解决方法_第1张图片
这是在PC上960 * 640分辨率下的大厅界面,如果不做适配处理,在android手机上(分辨率:1920*1080)的运行截图如下:
cocos2dx 打包android遇到的问题和解决方法_第2张图片
可以看到,变形严重.

解决办法:
在设计界面时,设定一个设计尺寸(designX,designY),然后在具体的终端上时,获取屏幕分辨率(screenX,screenY),然后,

scaleX = screenX / designX;
scaleY = screenY / designY;

然后在布局界面时,将空间的位置和大小进行X和Y轴的缩放即可,在实际过程中,如果对节点(Node)的大小进行缩放时,会导致节点变形,这时可以通过对大小进行scaleX或者scaleY的比例缩放,或者取两者的均值进行缩放,这样得到的结果会和设计时的界面样式差异不大,而且绝不会有上述图片中的变形问题;
在这个游戏中,我是写了一个WindowUtil类,来存放缩放相关的变量,具体代码可见链接

对于该方法,该博客讲述的比较清楚.

你可能感兴趣的:(cocos2dx)