2013-12-14 43 views
10

我的本機活動應用程序出現了一些問題。它可以在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」選項存在。

另外我注意到,這些有問題的設備大部分都有瑞芯微CPU(RK3066,RK2928,RK2926)。但不是所有的。最新的有華爲K3V2 CPU和大量的可用內存。 另一本地活動應用程序(不是我的)也不適用於最新的設備。

+0

任何在異常之前獲取日誌消息的機會? 'dlopen()'可能有錯誤信息。 – fadden

+0

我會盡力的。但是最好的辦法是什麼? 我總是在Android 2.3上使用Log Collector。但是由於某些原因,最新的Android版本日誌非常短。似乎對日誌大小有一些系統限制。 – NightRadio

+0

如果設備無法加載庫,是否100%可重現? –

回答

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()的另一個好處是,它還允許您重現幕後發生的一些事件,並使用更多調試日誌記錄來幫助您追蹤問題。

+2

當調試覆蓋NativeActivity的方法時,您可能還會發現這個小黑客有幫助: HTTP://計算器。com/a/8261608/1002212 – paulscode

+2

謝謝! 現在終於有效了!但我不明白爲什麼:) 我只將此代碼添加到主類(基於NativeActivity):@覆蓋保護無效onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState); }' – NightRadio

相關問題