Unity整合Android时异常

把Unity内容整合到Android工程后出现so文件

出现类似异常:

Fatal signal 11 (SIGSEGV), code 1, fault addr 0x4ab01 in tid 28051 (UnityHardwareCa)

或者

Fatal signal 11 (SIGSEGV), code 1, fault addr 0x3c in tid 4674 (UnityGfxDeviceW)

Unity整合Android , 错误Fatal signal 11 (SIGSEGV)_第1张图片

看描述貌似是指 libunity.so库引用指针0x4ab01 时出现signal, 网络很多人说是u3d没有使用“多线程渲染”,但是查看u3d人员构建时确实选择多线程渲染, 所以这理由又胎死腹中。。

最后经过多方咨询 和 试验 得出结论, 如果是包含有原生Activity跳转相关操作时, 会对UnityPlayer控件执行相应的pause()resume()操作, 当频繁地执行pause和resume切换时就会出现以上异常。

请看封装Activity源码:

public class UnityPlayerActivity extends Activity{    protected UnityPlayer mUnityPlayer; // don't change the name of this variable; referenced from native code    // Setup activity layout    @Override protected void onCreate (Bundle savedInstanceState)    {        requestWindowFeature(Window.FEATURE_NO_TITLE);        super.onCreate(savedInstanceState);        getWindow().setFormat(PixelFormat.RGBX_8888); // <--- This makes xperia play happy        mUnityPlayer = new UnityPlayer(this);        setContentView(mUnityPlayer);        mUnityPlayer.requestFocus();    }    @Override protected void onNewIntent(Intent intent)    {        setIntent(intent);    }    // Quit Unity    @Override protected void onDestroy ()    {        mUnityPlayer.quit();        super.onDestroy();    }    // Pause Unity    @Override protected void onPause()    {        super.onPause();        mUnityPlayer.pause();    }    // Resume Unity    @Override protected void onResume()    {        super.onResume();        mUnityPlayer.resume();    }    //............}

以上源码可以看出,UnityPlayer的生命周期是与Acitivty生命周期绑定的,我要说的是:问题就出在这!

解决方案:
1. 创建Activity时就调用UnityPlayer.resume();
2. 界面重启时先从界面中移除、再重新add;
3. Activity执行pause和resume时不需要调用其pause和resume。

重写onCreate()、onRestart()、 onPause()、onResume() :

public class UnityPlayerActivity extends Activity{    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        getWindow().setFormat(PixelFormat.RGBX_8888);        setContentView(R.layout.activity_main2);        mUnityPlayer = new UnityPlayer(this);        root = (ViewGroup)findViewById(R.id.root_layout);        //注: 创建Activity时就调用UnityPlayer.resume()        if (mUnityPlayer != null) {            root.addView(mUnityPlayer, 0);            mUnityPlayer.requestFocus();            mUnityPlayer.resume();        }    }    @Override    protected void onRestart() {        super.onRestart();        //注: 界面重启时先从界面中移除, 再重新add        if (mUnityPlayer != null && root != null) {            root.removeView(mUnityPlayer);            mUnityPlayer.requestFocus();        }        if (mUnityPlayer != null) {            root.addView(mUnityPlayer, 0);        }    }   //注: 不需要调用其pause和resume   /*@Override protected void onPause() {        super.onPause();        mUnityPlayer.pause();    }    @Override protected void onResume() {        super.onResume();        mUnityPlayer.resume();    }*/}

更多相关文章

  1. 自制android1.5的源码包
  2. android 工程 日志输出 附源码
  3. 分享20个Android游戏源码,…
  4. 覆盖Android开发各个领域的近百个源码项目下载
  5. Android UI结构源码研究
  6. [Android] Handler源码解析 (Java层)
  7. Android开发之fedora13下编译Android源码
  8. android基础-界面代码

随机推荐

  1. Android开发中用到的命令—整理贴
  2. Android(安卓)studio 中Activity以及Edit
  3. google map api 下载
  4. android 植入点乐广告方法
  5. Android实现图片单点旋转缩放保存-仿百度
  6. Google Map API Key 获得方法
  7. Android的Fragment中onActivityResult不
  8. [android]android自动化测试三之设定AVD
  9. 自定义Android视频播放器 - 自定义Surfac
  10. 在android中通过gps wifi定位位置