Native Activity应用程序中的“无法找到本机库”错误

时间:2013-12-14 13:32:00

标签: android android-ndk native-activity

我的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应用程序(不是我的)也不适用于最新的设备。

1 个答案:

答案 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()的另一个好处是,它还允许您重现幕后发生的一些事情,使用更多的调试记录来帮助您追踪问题。