我有一个使用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。
最佳答案
我发现了问题:设置屏幕方向会破坏活动并重新创建它。
为了解决这个问题,我不能更改屏幕方向,也不能检查传递给onCreate的Bundle是否为null。
感谢那些帮助我的人。