如何从Android捕获静态java.lang.UnsatisfiedLinkError并向用户显示更好的错误消息?

ash*_*gpu 5 java android android-ndk android-activity

创建后,我的应用程序会加载各种共享对象。我想捕获由于共享对象不存在于设备而引发的错误,并向用户显示更好的错误消息。我该如何实现?

我可以抓住java.lang.UnsatisfiedLinkError这样的

static
{
    try
    {
        System.loadLibrary("MyApplication");
    }
    catch(java.lang.UnsatisfiedLinkError e)
    {
        if(e.getMessage().contains("libSharedObject"))
        {
            Log.e( TAG, "This device does not support ..." );
        }
        else
        {
            throw e;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,Toast.makeText(...).show()以及其他应用程序消息框将不起作用,因为该应用程序将onCreate()由于先前的错误而死亡。

是否可以更改系统默认错误消息“不幸的是有一个错误..”的方法?还是通过其他进程或Android OS显示错误消息的方式?

ash*_*gpu 6

我用这个答案找到了答案。我在该static {}块中捕获了异常,设置了一个有错误和消息的成员变量,然后创建了一个新线程,该线程使用Toast显示错误并使用Looper在该线程中调用消息循环。在让应用程序崩溃之前,我需要休眠主线程一段时间。

static boolean mWasError = false;
static String mErrorMessage = "";

static
{
    try
    {
        System.loadLibrary("MyApplication");
    }
    catch(java.lang.UnsatisfiedLinkError e)
    {
        if(e.getMessage().contains("libOpenCL"))
        {
            Log.e( TAG, "This device does not support OpenCL" );
            mWasError = true;
            mErrorMessage = "This device does not support OpenCL";
        }
        else
        {
            throw e;
        }
    }
}


@Override
protected void onCreate( Bundle savedInstanceState )
{
    if(mWasError)
    {
        new Thread() {
            @Override
            public void run() {
                Looper.prepare();
                Toast.makeText(getApplicationContext(), mErrorMessage, Toast.LENGTH_SHORT).show();
                Looper.loop();

            }
        }.start();

        try
        {
            Thread.sleep(10000);
        }
        catch(InterruptedException e)
        {
        }
    }

    // Will crash here if there was an error
    super.onCreate(savedInstanceState);
Run Code Online (Sandbox Code Playgroud)