gpt4 book ai didi

java - Android - 为什么我的 Activity 被破坏了?

转载 作者:行者123 更新时间:2023-12-01 11:06:58 26 4
gpt4 key购买 nike

我有一个使用 JNI 和 NDK 在 UI 后台运行 native 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 成功结束并且没有在 native 代码中抛出任何异常并且 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;

}

我认为提供更多内容没有意义,因为它会变得非常大。我可以告诉你,该函数不会抛出 native 异常,也不会返回 false。

最佳答案

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

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

感谢那些帮助过我的人。

关于java - Android - 为什么我的 Activity 被破坏了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32848566/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com