我的Native Activity应用程序存在一些问题。它在99%的设备上运行良好。但有时用户会收到以下错误:
java.lang.RuntimeException: Unable to start activity ComponentInfo{nightradio.sunvox/nightradio.sunvox.MyNativeActivity}:
java.lang.IllegalArgumentException: Unable to find native library: sundog
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2070)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2095)
at android.app.ActivityThread.access$600(ActivityThread.java:134)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1203)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4830)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556)
at dalvik.system.NativeStart.main(Native Method)
...
我无法理解为什么。该应用程序在armeabi,armeabi-v7a和x86文件夹中包含所有必需的库。它已经在许多具有不同架构的设备上进行了测试。
android:hasCode =“true”选项存在。
我也注意到,大多数这些有问题的设备都有Rockchip CPU(RK3066,RK2928,RK2926)。但不是所有的。最新的一款拥有华为K3V2 CPU和大量可用内存。 另一个Native Activity应用程序(不是我的)也不适用于最新的设备。
答案 0 :(得分:4)
您需要阅读logcat输出以查看崩溃之前发生的事情,这会阻止本机库加载。我为我的应用程序使用Acra(生成包含logcat输出的崩溃报告),但作为获取logcat输出而不实现整个崩溃报告系统的快速解决方案,您可以在测试构建中使用类似的东西,并且用户运行它:
try
{
Process process = Runtime.getRuntime().exec( "logcat -d" );
BufferedReader bufferedReader = new BufferedReader(
new InputStreamReader( process.getInputStream() ) );
StringBuilder log = new StringBuilder();
String line = "";
while( ( line = bufferedReader.readLine() ) != null ) {
log.append( line );
}
// Output available via log.toString().. do whatever with it
}
catch( IOException e ) {}
如果查看source code for NativeActivty,您看到的此异常会在onCreate()方法中抛出(请参阅第171行),因此如果您在NativeActivity的派生类中重写该方法,则可以捕获它并从那里获取logcat输出。然后,您可以将日志保存到文件中,让受影响设备的用户运行测试并将文件通过电子邮件发送给您,例如。
覆盖onCreate()的另一个好处是,它还允许您重现幕后发生的一些事情,使用更多的调试记录来帮助您追踪问题。