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)

看描述貌似是指 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. Android(安卓)Studio——ListView的高级使用
  2. Android(安卓)onSaveInstanceState()和onRestoreInstanceState()
  3. android腾讯微博吹一吹实现原理
  4. Android(安卓)TabHost的使用 .
  5. 【Android】- Android(安卓)Service的两种启动方式
  6. android基础-界面代码
  7. Android(安卓)进阶16:IntentService 使用及源码解析
  8. Android(安卓)调用系统Camera
  9. Android(安卓)UI结构源码研究

随机推荐

  1. 解决工程导入出现the currently displaye
  2. appium简明教程(7)——Desired Capabilitie
  3. android 项目 local_Test_exam 代码分享
  4. 探索Popupwindow-对话框风格的窗口(
  5. Android(安卓)基于TranslateAnimation 的
  6. android View 树的理解
  7. [Xamarin.Android] 儲存資料於Windows Az
  8. Android——用XML的selector实现按钮多态
  9. 第五章(6)Libgdx应用框架之接口
  10. Android(安卓)5.X新特性