10

我的 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 应用程序(不是我的)也不能在最新的设备上运行。

4

1 回答 1

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 ) {}

如果您查看NativeActivty 的源代码,您看到的这个异常会在 onCreate() 方法中抛出(参见第 171 行),因此如果您在 NativeActivity 的派生类中重写该方法,您可以捕获它并获取 logcat从那里输出。然后,您可以将日志保存到文件中,并让使用受影响设备的用户运行测试并将文件通过电子邮件发送给您。

覆盖 onCreate() 的另一个好处是,它还可以让您重现幕后发生的一些事情,并使用更多调试日志记录来帮助您跟踪问题。

于 2013-12-31T15:52:26.590 回答