概况
在cocos2d-x 3.4及后续版本中,如何在制作apk时加载第三方的so文件,论坛中已经出现很多这样提问的帖子。同样我也在当前的项目中遇到这样的需求,需要在一个已经做好的游戏中添加第三方的so。我自己摸索了好久最后还是在版主的指导下顺利的通过了。现在将我在期间遇到的坑和最后编写的脚本文件分享给大家:-)
-
直接拷贝.so到proj.android/libs/armeabi目录下
每次执行cocos compile命令编译的时候,libs/armeabi目录都会被清空,所以这种简单粗暴的办法行不通. -
修改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网事对我的帮助!