[英]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.