Cocos2dx 3.x的android studio项目之间.so库、资源移植

来源:互联网 发布:2002文泰刻绘软件下载 编辑:程序博客网 时间:2024/06/07 03:01

如果你被下面这个报错困扰了好久,这篇文章也许会给你提供帮助。

java.lang.UnsatisfiedLinkError: com.android.tools.fd.runtime.IncrementalClassLoader$DelegateClassLoader[DexPathList

正文:

有时候,我们可能需要把Cocos2dx的proj.android-studio项目中编译好的.so库移植到我们某个android studio项目中进行使用,但经常会遇到本文将详细介绍整个移植过程。

图1是cocos2dx项目中AS平台的工程。通过编译(cocos compile -p android –android-studio),已经产生了.so库文件。现在,我想将A中产生的动画效果或是资源转移到我已有的android项目中(AS项目)。那么需要如何操作呢?

这里写图片描述

图1.已经编译产生so库的cocos2dx AS项目A

这里写图片描述

图2.需要导入cocos2dx资源的AS项目B

1、在项目B中,File->New->Import Moudle, 将Cocos2dx项目中的libcocos2dx库工程导入,我的库工程目录如下图。(注意:libcocos2dx库工程不在proj.android-studio目录下,而在原始的Cocos2dx的cocos2d\cocos\platform\android\java下)。

这里写图片描述

成功导入后,项目B如下所示:

这里写图片描述

在项目B中,File->Project Structure,给app添加libcocoss2dx项目依赖。

这里写图片描述

2、将项目A中libs下的armeabi以及其中的libcocos2dcpp.so一同copy到项目B的libs文件夹下。

这里写图片描述

3、将项目A中的assets文件夹及其子文件,拷贝到项目B的app目录下(如果你的项目中已经有assets目录,你可以直接copy子文件到里面去)。

这里写图片描述

4、在app的AndroidManiFest.xml文件中加入如下代码(Cocos2dxActivity会根据这个名称来加载so库,也可以不加这个代码,在activity初始化时用System.loadLibrary(“cocos2dcpp”)来加载.so库):

    <meta-data        android:name="android.app.lib_name"        android:value="cocos2dcpp"/>

5、最重要的一部,正确的指定.so库和assets。在app的build.gradle中加入如下代码:

     sourceSets {        main {            jniLibs.srcDirs = ['libs']            assets.srcDirs = ['assets']        }    }

app的build.gradle的完整代码:

这里写图片描述

重点说明一下,jniLibs.srcDirs = [‘libs’]就是指向armeabi/*.so的所在处,assets.srcDirs = [‘assets’]指向assets文件夹的所在处。所以,.so和assets的不一定非要放在固定的地方,如果更改位置,只要修改这里即可。[‘libs’]是以app目录为参考的(libs在app根目录下),举例:如果你把assets文件夹放在src目录下,那么就修改assets.srcDirs = [‘assets’]为 assets.srcDirs = [‘src/assets’],libs同理。(注意:每次修改build.gradle之后,要rebuild project来保证修改生效)

6、以上就是整体的移植配置工作,然后新建MainActivity.java , 继承Cocos2dxActivity, 就能运行你在.so中封装的各种功能、动画了。要想深入研究,看Cocos2dxActivity的代码,顺藤摸瓜,就能更好的将C++和Java混合使用了,这里不多做介绍。

MainActivity.java代码

import android.os.Bundle;import org.cocos2dx.lib.Cocos2dxActivity;public class MainActivity extends Cocos2dxActivity{    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);    }}

以下是我.so中库中的效果:

这里写图片描述

有错误或是问题,欢迎留言讨论。

0 0
原创粉丝点击