• unity3d android动态更新dll


    基本是参考这篇文章:http://blog.sina.com.cn/s/blog_9e5d42ee0102vvtg.html,进行了增删一波。

    大略说一下基本步骤:1.下载mono源码,修改源码,编译得到libmono.so,替换掉打包机上(开发机就没必要了)unity安装目录下的libmono.so;

              2.在你项目检查版本控制那里,如果dll更新了,把路径"/data/data/packname/files"下的Assembly-CSharp.dll删掉,

               下最新的dll扔到该路径,下完后设置本地版本为最新版本;

              3.调用sdk接口重启游戏。

    下面细说:

    1.

      1)去github下mono源码(这里要注意,一定要下对应你Unity版本的mono)

      下mono地址:https://github.com/Unity-Technologies/mono ,下对应mono版本。

      (查找自己unity对应mono版本:)

      2)修改mono源码:

      在加载Assembly-CSharp.dll的地方判断如果加载的字节流名字是Assembly-CSharp.dll就加载你所存的dll,
    把该dll的字节流换掉传入的Assembly-CSharp.dll的字节流(记得释放内存),代码如下:

    MonoImage *
        mono_image_open_from_data_with_name (char *data, guint32 data_len, gboolean need_copy, 
          MonoImageOpenStatus *status, gboolean refonly, const char *name) { //修改开始1 int datasize = 0; if(strstr(name,"Assembly-CSharp.dll")){ //重新计算路径,把/data/data/packname/files/Assembly-CSharp.dll加载到data中 const char* _pack = strstr(name,"com."); const char* _pfie = strstr(name,"-");//这个我不清楚,记住即可 char _name[512]; memset(_name,0,512); int _len0 = (int)(_pfie - _pack); memcpy(_name , "/data/data/",11); memcpy(_name + 11, _pack,_len0); memcpy(_name + 11 + _len0 ,"/files/Assembly-CSharp.dll",26); g_message("momo: path = %s ", _name); char* bytes = ReadStringFromFile (_name,&datasize);//这个自己实现,不贴代码了,本文开头引用的那篇文章有 if(datasize > 0){ data = bytes; data_len = datasize; //data[0] -= (char)getKey(); //g_message("momo: key = %d ", getKey()); } } //修改结束1 ... //修改开始2 if(datasize > 0 && data != 0){ g_free (data); } //修改结束2 }

      3)编译得到libmono.so,

      编译可参考(如果下面链接失败了,直接到http://www.luzexi.com/unity3d这里看目录找):

    http://www.luzexi.com/unity3d/%E6%B8%B8%E6%88%8F%E6%9E%B6%E6%9E%84/%E5%89%8D%E7%AB%AF%E6%8A%80%E6%9C%AF/2015/04/11/Unity3D-%E9%87%8D%E6%96%B0%E7%BC%96%E8%AF%91Mono%E5%8A%A0%E5%AF%86DLL.html

      编译成功后得到libmono.so, 替换掉unity安装目录下的libmono.so,要保证换掉后能用啊,不能用基本是下的mono版本不对,搜索解决。

    2.这个就是项目的东西了,也只是版本控制的一个小点,比资源版本控制简单多了,可以看一下你所在项目的版本控制代码就好(版本控制一般包括资源版本,apk版本,dll版本,配置文件版本等),基本就是把你的dll放到/data/data/packname/files/下让修改后的mono源码使用。

    3.这个不用说了吧。

  • 相关阅读:
    Vue 全局过滤器和局部过滤器使用方式
    Vue 标签显示/隐藏的方式对比demo
    OpenSSL SSL_read: Connection was reset, errno 10054
    Vue 自定义全局指令和局部指令demo
    Vue 列表渲染demo
    Vue Class样式和style样式编写
    vue中的函数(methods),计算属性(computed),监听器(watch)的区别demo
    Vue 常用指令
    针对 WebSocket 协议的 Locust 压测脚本实现(基于 Locust 1.0 以上版本)
    Locust 脚本开发入门(4)
  • 原文地址:https://www.cnblogs.com/Tearix/p/6873899.html
Copyright © 2020-2023  润新知