【问题标题】:Android - Wh is my activity being destroyed?Android - 为什么我的活动被破坏了?
【发布时间】:2015-09-29 15:54:44
【问题描述】:

我有一个使用 JNI 和 NDK 在 UI 后台运行本机 C++ 的应用程序。 Native层在onCreate初始化,在onDestroy终结。

public class XXXXActivity extends Activity
{
    TermScreenView mTermScreenView = null;

    @Override
    protected void onCreate( Bundle savedInstanceState )
    {
        super.onCreate( savedInstanceState );

        try
        {
            this.setRequestedOrientation( ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE );

            setContentView( R.layout.activity_XXXX );
            mTermScreenView = (TermScreenView) findViewById( R.id.termScreenView );

            if( ! initializeNative() )
            {
                Toast.makeText( getBaseContext(), "Failed to initialize", Toast.LENGTH_LONG ).show();
                throw new Exception( "Failed to initialize native layer" );
            }
        }
        catch( Exception exc )
        {
            exc.printStackTrace();
        }
    }

    @Override
    public void onDestroy()
    {
        finalizeNative();

        super.onDestroy();
    }

    public native boolean initializeNative();

    public native boolean finalizeNative();

    // Etc
}

由于某种原因,在initializeNative 通过返回true 成功结束并且没有在本机代码中抛出任何异常并且onCreate 也成功结束之后,onDestroyed 在几毫秒后被调用。 一旦 onCreate 在我的应用程序中结束,什么都不应该被调用,除了onDestroy 当用户退出它时。

我不知道为什么onDestroy 被调用,因为onCreate 成功了。 可能是什么原因?

谢谢你:)

编辑: 这是来自 initializeNative 的代码:

jboolean XXXXActivity_initializeNative( JNIEnv * pEnv, jobject pActivityObject )
{
    TRACE_I( g_pJniLog, "::XXXXActivity_initializeNative() - Begin." );

    if( NULL != g_pAppAdapt )
    {
        TRACE_I( g_pJniLog, "::XXXXActivity_initializeNative() - End, already called." );
        return false;
    }

    jclass pActivityClass = pEnv->FindClass( "XXXXActivity" );
    assert( NULL != pActivityClass );
    TRACE_I( g_pJniLog, "::XXXXActivity_initializeNative() - pActivityClass = %p.", pActivityClass );

    g_pActivityClass = (jclass) pEnv->NewGlobalRef( pActivityClass );
    assert( NULL != g_pActivityClass );

    g_pActivityObject = (jobject) pEnv->NewGlobalRef( pActivityObject );
    assert( NULL != g_pActivityObject );

    TRACE_I( g_pJniLog, "::XXXXActivity_initializeNative() - Creating XXXXActivityAdapter." );
    g_pAppAdapt = new XXXXActivityAdapter();

    TRACE_I( g_pJniLog, "::XXXXActivity_initializeNative() - Initializing XXXXActivityAdapter." );
    g_pAppAdapt->InitializeInstance();

    TRACE_I( g_pJniLog, "::XXXXActivity_initializeNative() - End, success." );
    return true;

}

我不认为提供更多是相关的,因为它会变得非常大。我可以告诉你,该函数不会抛出原生异常,也不会返回 false。

【问题讨论】:

  • 我要测试的第一件事是注释掉对 initializeNative() 的调用,看看会发生什么。
  • initializeNative 中显示一些代码会有所帮助。
  • 感谢您的 cmets。似乎不调用初始化本机不会导致错误,所以我会调查更多。
  • 我已经确保捕捉到任何可能在initializeNative 中抛出的内容,我还使用if( pEnv->ExceptionCheck() ) { pEnv->ExceptionDescribe(); pEnv->ExceptionClear(); } 检查了JNI 异常,但如果我不取消注释,onDestroy 仍然会被调用调用initializeNative。在 initializeNative 中有一个从 C++ 到 JAVA 的调用,但我还在此调用的位置检查 JNI 异常。也许我没有正确或在正确的时刻检查 JNI 异常。
  • 我遇到了一个奇怪的行为:在 onCreate 之后,调用了 onDestroyed,然后再次调用了 onCreate,但随后就不再调用 onDestroy。我首先认为我的应用程序的两个实例正在登录同一个日志猫,这可以解释,但是所有线程和进程 ID 都是相同的!我在强制应用程序关闭后尝试过,以确保它在开始调试时尚未运行,但结果相同。我迷路了。

标签: java android android-activity android-ndk java-native-interface


【解决方案1】:

我发现了问题:设置屏幕方向正在破坏活动并重新创建它。

为了解决这个问题,我要么不改变屏幕方向,要么检查传递给 onCreate 的 Bundle 是否为空。

感谢那些帮助过我的人。

【讨论】:

猜你喜欢
  • 2015-01-29
  • 1970-01-01
  • 2019-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多