【发布时间】: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