我有一个应用程序,它使用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。
答案 0 :(得分:1)
我发现了问题:设置屏幕方向会破坏活动并重新创建它。
要解决此问题,我可以不更改屏幕方向或检查传递给onCreate的Bundle是否为空。
感谢那些帮助过我的人。