在cocos console下通过脚本拷贝第三方so文件

概况
在cocos2d-x 3.4及后续版本中,如何在制作apk时加载第三方的so文件,论坛中已经出现很多这样提问的帖子。同样我也在当前的项目中遇到这样的需求,需要在一个已经做好的游戏中添加第三方的so。我自己摸索了好久最后还是在版主的指导下顺利的通过了。现在将我在期间遇到的坑和最后编写的脚本文件分享给大家:-)

  1. 直接拷贝.so到proj.android/libs/armeabi目录下
    每次执行cocos compile命令编译的时候,libs/armeabi目录都会被清空,所以这种简单粗暴的办法行不通.

  2. 修改Android.mk文件
    很多网友分享了这个办法,在proj.android/jni目录下面创建一个prebuild目录,将要拷贝的so文件拷贝到该目录里面,然后修改proj.android/jni/Android.mk文件,在ndk编译的时候就会将这个第三方的so编译到libs/armeabi下面(假设第三方库文件为libxxxx.so)

include $(CLEAR_VARS)  
LOCAL_MODULE := xxx  
LOCAL_SRC_FILES := prebuilt/libxxx.so  
include $(PREBUILT_SHARED_LIBRARY)  
  
LOCAL_SHARED_LIBRARIES := xxx

```

我们unzip生成出来的apk,发现其中的libxxx.so的md5其实发生了改变。虽然这并不影响应用,但是对我这种强制症来说,还是希望md5一致。



3. 自定义so资源拷贝脚本
其实在cocos console中是为我们预留了对应的脚本,而且还有专门的文档来进行如何书写的详细描述:
http://www.cocos2d-x.org/wiki/Cocos2d-console#Add-custom-steps-during-compiling
我们只需要在ndk编译结束在进行ant build apk之前把脚本拷贝到proj.android/libs/armeabi就可以了。我的编译环境是ubuntu, 工程是cocos2d-x 3.7 lua,ant 1.9:
首先我们编辑cocos工程文件,该文件位于工程目录的根目录下,名为.cocos-project.json,一定要注意的是该文件前面加了一个点号,直接在图形窗口中是无法看到的,你使用ls -al就可以看到了.
{
     "custom_step_script": "frameworks/runtime-src/proj.android/custom_script.py",
     "engine_version": "cocos2d-x-3.7",
     "has_native": true,
     "project_type": "lua"
}

```


cocos console就会在编译的时候将不同的编译事件传递到我们自定义的custom_script.py脚本里面,我们就在这里完成资源的拷贝(这里我在proj.android下面建立了一个prebuild/libs的目录,并将libxxxx.so拷贝在里面)
现在我们在proj.android下面建立一个custom_script.py的脚本:

import os
import os.path
import cocos
from shutil import copy2

def copy_so_file(src, dst):
    names = os.listdir(src)
    for name in names:
        srcname = os.path.join(src, name)
        dstname = os.path.join(dst, name)
        try:
            copy2(srcname, dstname)
        except (IOError, os.error) as why:
            errors.append((srcname, dstname, str(why)))

def handle_event(event, target_platform, args):
    if target_platform != "android":
        return
    # cocos.Logging.info(event)
    if event != "pre-copy-assets":
        return
    # cocos.Logging.info("args is %s\n" % args)
    src = os.path.join(args"platform-project-path"], "prebuild", "libs", "armeabi")
    dst = os.path.join(args"platform-project-path"], "libs", "armeabi")
    # copy so
    copy_so_file(src, dst)

```

这样我们就达到目的了,在ant build apk之前将对应的so文件拷贝进去。好啦,收工!再次感谢版主偶尔e网事对我的帮助!

请问在eclipse里面如何做同样操作? mm iap的接入就有这个问题,so一变,计费窗口就无法正常初始化了

Eclipse、AS看这里。
http://www.cocoachina.com/bbs/read.php?tid-319224.html