1

爲什麼我在standard Android Level 10 API上收到此錯誤?我創建了最簡單,最短的測試案例,所以我可以粘貼如下整個 Android項目:針對java.lang.Package.getDeclaredAnnotations的UnsatisfiedLinkError的極簡化測試案例

E/AndroidRuntime( 406): java.lang.UnsatisfiedLinkError: getDeclaredAnnotations 
E/AndroidRuntime( 406): at java.lang.Package.getDeclaredAnnotations(Native Method) 
E/AndroidRuntime( 406): at java.lang.Package.getDeclaredAnnotations(Package.java:107) 
E/AndroidRuntime( 406): at com.foobar.android.heartbeat.CustomAppWidgetProvider.onEnabled(CustomAppWidgetProvider.java:15) 
E/AndroidRuntime( 406): at android.appwidget.AppWidgetProvider.onReceive(AppWidgetProvider.java:73) 

AndroidManifest.xml中

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.foobar.android.cannotate" 
    android:versionCode="1" 
    android:versionName="1.0" > 
    <uses-sdk android:minSdkVersion="10" /> 
    <application> 
     <receiver android:name="com.foobar.android.cannotate.CustomAppWidgetProvider"> 
      <intent-filter> 
       <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> 
      </intent-filter> 
      <meta-data 
       android:name="android.appwidget.provider" 
       android:resource="@xml/custom_app_widget_provider_info" /> 
     </receiver> 
    </application> 
</manifest> 

2.的src/COM/foobar/android/cannotate/CustomAppWidgetProvider.java`

package com.foobar.android.heartbeat; 
import java.lang.annotation.Annotation; 
import android.appwidget.AppWidgetProvider; 
import android.content.Context; 
import android.util.Log; 

public class CustomAppWidgetProvider extends AppWidgetProvider { 
    @Override 
    public void onEnabled (Context context) { 
     super.onEnabled(context); 
     Log.d(getClass().getCanonicalName(), "about to get annotations"); 
     Annotation [] annotations = CustomAppWidgetProvider.class.getPackage().getDeclaredAnnotations(); 
     Log.d(getClass().getCanonicalName(), "annotations.length = " + annotations.length); 
    } 
} 

3. RES/XML/custom_app_widget_provider_info.xml

<?xml version="1.0" encoding="utf-8"?> 
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android" 
    android:initialLayout="@layout/custom_app_widget" 
    > 
</appwidget-provider> 

4. RES /佈局/ custom_app_widget.xml

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    > 
    <TextView 
     android:id="@+id/value" 
     android:text="@string/empty" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     /> 
</FrameLayout> 

5. RES /值/ strings.xml中

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <string name="empty">-</string> 
</resources> 

回答

1

你看到的例外是發生g,因爲Package.getDeclaredAnnotations()的本地代碼方法未在運行的平臺上由運行時系統實現。根據this android issue,Davlik目前根本不支持Package註釋。這是一個例外。

AFAIK,除了避免使用Package註釋之外,沒有什麼可以做的。 (並動員你的親友投票解決問題!)

+0

謝謝。鑑於最近修復返回一個空數組(根據您的鏈接),這會不會發生在Android 4.x上?請注意,我不希望使用包註釋,如果Android返回空數組,我很高興。這只是爆炸是問題,我不知道Android 4.x會不會爆炸? – necromancer 2011-12-23 01:42:49

+0

@agksmehx - 我無法回答有關Android 4.x的問題。但如果你實際上不想使用該方法,也許你應該改變代碼來刪除調用... – 2011-12-23 01:45:39

+0

這是一個庫,所以很難刪除調用 – necromancer 2011-12-23 02:16:53