public class MainActivity extends Activity {
private GLSurfaceView _glSurfaceView;
private GLRenderer _glRenderer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
JniBridgeJava.SetActivityInstance(this);
JniBridgeJava.SetContext(this);
_glSurfaceView = new GLSurfaceView(this);
_glSurfaceView.setEGLContextClientVersion(2);
_glRenderer = new GLRenderer();
_glSurfaceView.setRenderer(_glRenderer);
_glSurfaceView.setRenderMode(GLSurfaceView.RENDERMODE_CONTINUOUSLY);
setContentView(_glSurfaceView);
getWindow().getDecorView().setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_FULLSCREEN
| (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT
? View.SYSTEM_UI_FLAG_LOW_PROFILE
: View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY)
);
}
@Override
protected void onStart() {
super.onStart();
JniBridgeJava.nativeOnStart();
}
@Override
protected void onResume() {
super.onResume();
_glSurfaceView.onResume();
}
@Override
protected void onPause() {
super.onPause();
_glSurfaceView.onPause();
JniBridgeJava.nativeOnPause();
}
@Override
protected void onStop() {
super.onStop();
JniBridgeJava.nativeOnStop();
}
@Override
protected void onDestroy() {
super.onDestroy();
JniBridgeJava.nativeOnDestroy();
}
@Override
public boolean onTouchEvent(MotionEvent event) {
float pointX = event.getX();
float pointY = event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
JniBridgeJava.nativeOnTouchesBegan(pointX, pointY);
break;
case MotionEvent.ACTION_UP:
JniBridgeJava.nativeOnTouchesEnded(pointX, pointY);
break;
case MotionEvent.ACTION_MOVE:
JniBridgeJava.nativeOnTouchesMoved(pointX, pointY);
break;
}
return super.onTouchEvent(event);
}
}
live2d 官方的demo 是按照Android的生命周期来写的。Android生命周期中 onstop方法是在跳转到其他activity 必然会调用。当我们live2d库还未加载完成资源就跳转并释放资源会返回崩溃,为什么在其他activity不崩溃而返回来的时候崩溃,因为C++代码
void LAppDelegate::OnStop()
{
if (_view)
{
delete _view;
_view = NULL;
}
if (_textureManager)
{
delete _textureManager;
_textureManager = NULL;
}
// リソースを解放
LAppLive2DManager::ReleaseInstance();
CubismFramework::Dispose();
}
模型已经停止渲染了, 你在其他activity未返回的时候就按下了暂停键有没有资源都无所谓,但是你一旦返回原来的activity 又调用 onStart 方法
void LAppDelegate::OnStart()
{
_textureManager = new LAppTextureManager();
_view = new LAppView();
LAppPal::UpdateTime();
}
又重新渲染,但资源又释放了,所以就崩溃了。Android又废一点崩溃日志都没有,我调试了很久才知道是 OnStop 函数出问题。
如何修复呢?
很简单只要把最后两行移下来就好
void LAppDelegate::OnStop()
{
if (_view)
{
delete _view;
_view = NULL;
}
if (_textureManager)
{
delete _textureManager;
_textureManager = NULL;
}
}
void LAppDelegate::OnDestroy()
{
// リソースを解放
LAppLive2DManager::ReleaseInstance();
CubismFramework::Dispose();
ReleaseInstance();
}