Android - Wh是我被破坏的活动?

时间:2015-09-29 15:54:44

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

我有一个应用程序,它使用JNI和NDK在UI的后台运行本机C ++。原始图层在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。

1 个答案:

答案 0 :(得分:1)

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

要解决此问题,我可以不更改屏幕方向或检查传递给onCreate的Bundle是否为空。

感谢那些帮助过我的人。