繁体   English   中英

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

[英]How do I catch a static java.lang.UnsatisfiedLinkError from Android and show the user a better error message?

我的应用程序在创建时加载各种共享对象 我想捕获错误,因为共享对象不存在于设备上并向用户显示更好的错误消息。 我该如何实现这一目标?

我可以像这样捕获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;
        }
    }
}

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

有没有办法更改系统默认错误消息“不幸的是有错误..”? 或者用另一个进程或Android操作系统显示错误消息的方法?

我用这个答案找到了答案 我在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);

您可以在以后显示主Activity时开始加载库。 如果抛出异常,您将能够显示Toast或AlertDialog。

虽然这一切都很奇怪。 不是* .so是apk的一部分,你似乎知道你在apk中有哪些。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM