Чрезвычайно упрощенный тестовый пример для UnsatisfiedLinkError на java.lang.Package.getDeclaredAnnotations

1

Почему я получаю эту ошибку на стандартном API уровня 10 для Windows? Я создал простейший, самый короткий возможный тестовый пример, поэтому я могу вставить весь проект Android ниже:

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)

1. 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/layout/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/values /strings.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="empty">-</string>
</resources>
Теги:
android-emulator
android-widget
unsatisfiedlinkerror

1 ответ

1
Лучший ответ

Исключение, которое вы видите, происходит потому, что встроенный метод кода для Package.getDeclaredAnnotations() не реализован системой выполнения на платформе, на которой вы работаете.

Согласно этой проблеме Android, Davlik в настоящее время не поддерживает аннотации пакетов вообще. Исключением является симптом этого.

AFAIK, вы ничего не можете с этим поделать, кроме как избежать аннотаций пакета. (И мобилизовать своих друзей и родственников, чтобы проголосовать за вопрос, который будет исправлен!)

  • 0
    Спасибо. Разве это не произойдет на Android 4.x, учитывая недавнее исправление, возвращающее пустой массив (по вашей ссылке)? Обратите внимание, что я не хочу использовать аннотации пакетов, и я рад, если Android возвращает пустой массив. Проблема только в взрыве, и мне интересно, не взорвется ли Android 4.x?
  • 0
    @agksmehx - я не могу ответить на вопрос об Android 4.x. Но если вы на самом деле не хотите использовать метод, возможно, вам следует изменить код, чтобы удалить вызовы ...
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню