Cocos2D-X 3.4 移植 Android

来源
http://www.58player.com/blog-2537-89679.html [1]
https://www.youtube.com/watch?v=xqtT0E68TJM [2]
http://stackoverflow.com/questions/26179742/error-while-running-project-from-eclipse [3]

正文

导入项目

首先导入Cocos2D-X lib项目, 按照如下步骤.

右键Package Explorer->Import->Android->Existing Android Code Into Workspace->Next
1

在上方Root Directory右侧, 选择Browse以导入Cocos2D-X lib项目, 路径在\cocos2d-x-3.4\cocos\platform\android\java, 图中笔者的路径为D:\Lib\cocos2d-x-3.4\cocos\platform\android\java
1

点击Finish导入完成.

使用同样的方法导入你的Cocos2D-X安卓工程文件. 路径在<你的工程根目录>\proj.android, 笔者的在D:\Projects\pianotiles\proj.android

导入之后如图:
1

编辑需要的库

一般情况下, project.properties不会被正确地配置. 不管项目上有没有看到红叉, 都应该检查一下这里.

右键工程->Properties->Android如图
123

选中带红叉的条目, 在右边选择Remove删掉. 然后选择Add添加. 选中Cocos2D-X的那个工程就好了, 也就是我们最开始添加的工程.
321

jni里面的mk文件

当前目录我们简单的处理完了,下面进到jni文件夹下面去看看, 目录为proj.android\jni, 或者直接在Eclipse里面就能看到.
1

先看Application.mk

APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -DCC_ENABLE_CHIPMUNK_INTEGRATION=1 -DCOCOS2D_DEBUG=1 -std=c++11 -fsigned-char

里面有两行代码,我们在最后给添加一行

APP_ABI := armeabi armeabi-v7a x86

这行代码很重要,他能解决你找不到 cocos2dcpp.so的错误提示,加了这行代码后,他编译的时候会编译出三个版本的.so文件,虽然慢一点,但是不会出错,如果你们不加他也没报错可以无视,当报那个错后,加上他就行了。

再来看Android.mk, 我们先一行一行来分析:

# 这四行不用管
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := cocos2dcpp_shared
LOCAL_MODULE_FILENAME := libcocos2dcpp

# 这个一看就知道应该是要把Classes目录下的所有的.cpp文件添加到这里,当然你可以选择手动添加,也可以用脚本添加
# 下面两段代码二选一

# -------- 默认, 手动模式 --------
LOCAL_SRC_FILES := hellocpp/main.cpp \
        ../../Classes/AppDelegate.cpp \
        ../../Classes/HelloWorldScene.cpp
# -------- -------- -------- --------

# -------- 脚本, 自动添加所有.cpp文件 --------
# 遍历目录及子目录的函数
define traversal
$(wildcard $(1)) $(foreach e, $(wildcard $(1)/*), $(call traversal, $(e)))
endef
# 遍历Classes目录
ALLFILES = $(call traversal, $(LOCAL_PATH)/../../Classes)
FILE_LIST := hellocpp/main.cpp
# 从所有文件中提取出所有.cpp文件
FILE_LIST += $(filter %.cpp, $(ALLFILES))
LOCAL_SRC_FILES := $(FILE_LIST:$(LOCAL_PATH)/%=%)
# -------- -------- -------- --------

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

# 我们接下来看static库
# 下面第二段代码为解释说明

# -------- 这三行是默认给我们创建好的 --------
LOCAL_WHOLE_STATIC_LIBRARIES := cocos2dx_static
LOCAL_WHOLE_STATIC_LIBRARIES += cocosdenshion_static
LOCAL_WHOLE_STATIC_LIBRARIES += box2d_static
# -------- -------- -------- --------

# -------- 如果我们想用cocos2dx里面的其他的功能模块,我们可以像下面这样添加 --------
LOCAL_WHOLE_STATIC_LIBRARIES := cocos2dx_static
LOCAL_WHOLE_STATIC_LIBRARIES += cocosdenshion_static
LOCAL_WHOLE_STATIC_LIBRARIES += box2d_static
LOCAL_WHOLE_STATIC_LIBRARIES += cocos_extension_static
# 看最后一行当我们程序中用到cocos的扩展时,需要加进来,反正照着上面那格式加就行了。 
# -------- -------- -------- --------

# 最后是import 
# 下面第二段代码为解释说明

# -------- -------- -------- --------
include $(BUILD_SHARED_LIBRARY)

$(call import-module,2d)
$(call import-module,audio/android)
$(call import-module,Box2D)
# -------- -------- -------- --------

# -------- -------- -------- --------
# 与上面LOCAL_WHOLE_STATIC_LIBRARIES的模块对应上,如果上面添加了extension下面就要改成这样 
include $(BUILD_SHARED_LIBRARY)

$(call import-module,2d)
$(call import-module,audio/android)
$(call import-module,Box2D)
$(call import-module,extensions)
# -------- -------- -------- --------
题外话

这里在提一个VS下添加依赖库的题外话,3.0创建工程时默认给我们添加了libAudio、libchipmunk、libcocos2d这三个模块,一般有这三个模块我们也够用了,如果想用扩展,按下图方法添加
Add lib

选中解决方案->右键->添加->现有项目->选择扩展包然后确定就行了,然后选中我们的工程名 比如我的工程名为”runping” 右键 “引用”
Ref

然后点击“新建引用”把我们新添加的勾上,确定就行了
New ref

到此JNI文件夹说完了,我们发现还有一个res文件夹,那个是用来换我们安装apk后的显示图片,我这里暂时不关心

生成

那么这个时候,我们需要在cmd中进入工程目录下运行build_native.py去生成我们需要的so文件了
Run py

运行OK后,会多出几个文件夹,目录结构图如下:
New dir

多了一个gen文件夹(自动生成)(转载注: 原文有, 但是我没有, 不过似乎不影响运行)、libs文件夹(用来存放libcocos2dcpp.so)、obj文件夹(看名字就知道是编译过程中生成的中间文件)、bin文件夹(最后.apk包所在地)、assets文件夹(存放资源文件)

至此我们的项目打开了,他会自动编译的,如果有错误会有console或logcat里面报出来,如果在vs下面修改了代码或者在文件浏览器中修改了东西,可以右键项目->刷新,或者点击项目窗口->清理

常见问题

XXXX cannot be resolved

这个时候有可能在JNI下的main.cpp前面有一个小小的红色叉叉,我们点进去发现他会提示一堆(转载者未遇到)

Unresolved inclusion: "AppDelegate.h
Unresolved inclusion: "cocos2d.h
Unresolved inclusion: "CCEventType.h
......

反正意思是说找不到这些头文件,但是这些头文件是确实存在的,路径也包含对了,这时我们为了让项目编译通过 我们需要这样设置项目->属性->C/C++常规照着下面的图操作就行了
Code Analysis
Syntax

把那个勾去掉就好了。这样项目就能编译通过了,这时我们需要把生成的apk包放到模拟器或者真机上运行看效果.

Eclipse 没有 C/C++ Build和C/C++ General选项

如果看不到C/C++ Build和C/C++ General选项的话, 需要在Eclipse里面为当前工程Add Native Support, 按照如下步骤:
首先设置NDK路径
Eclipse->Window->Preferences->左侧Android->NDK
NDK

然后为工程添加Native Support
右键工程->Android Tools->Add Native Support...
Add Native Support

AppDelegate问题

我们在项目上右键->运行方式->android application , 选择你的设备, 就可以运行了.

我的一个bug,编译与运行都没有错误,但是一运行到手机或模拟器上就一直黑屏,我试了各种办法都无果,最后发现我的AppDelegate 里面的启动函数和标准的cocos2dx里的有点不一样

bool AppDelegate::applicationDidFinishLaunching()
{
    // initialize director
    auto director = Director::getInstance();
    auto glview = director->getOpenGLView();
    if( !glview )
    {
        glview = GLView::create("run pig");
        //glview = GLView::create("run pig");
        glview->setFrameSize(360,640);
        director->setOpenGLView(glview);
        glview->setDesignResolutionSize(720, 1280, ResolutionPolicy::SHOW_ALL);
    }
    //我把下面的代码除了reutrn true外全放到上面的if里面了,然后在android上运行就一直黑屏也不报错,在win下正常,折磨了快2天啊,这里大家注意一下吧,不要犯像我SB一样的错误
    // turn on display FPS
    director->setDisplayStats(true);

    // set FPS. the default value is 1.0/60 if you don't call this
    director->setAnimationInterval(1.0 / 60);

    // create a scene. it's an autorelease object
    auto scene = WelcomeScene::scene();
    //auto scene = HelloWorld::createScene();
    // run
    director->runWithScene(scene);

    return true;
}
Multiple dex files define Lorg/cocos2dx/lib/Cocos2dxAccelerometer

这个问题通常是因为安卓编译器编译了重复的dex文件而导致[3], 所以我们需要移除多余的库或者java文件.

因为笔者使用了[1]中的方法建立Cocos2D-X 3.4的工程, 因此出现了com.chukong.*找不到的情况, 于是又另外import了一个libcocos2dx项目, 而导致与原src/org.cocos2dx.lib发生冲突.

所以直接删除src/org.cocos2dx.lib就可以了.
del

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值