java.lang.Package.getDeclaredAnnotations 上 UnsatisfiedLinkError 的极其简化的测试用例

发布于 2024-12-22 16:52:51 字数 3336 浏览 2 评论 0原文

为什么我在 标准 Android 级别上收到此错误10 API?我创建了最简单、最短的测试用例,因此我可以将整个 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>

Why I am I getting this error on a standard Android Level 10 API? I have created the simplest, shortest possible test case so I can paste the entire Android project below:

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>

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

雨的味道风的声音 2024-12-29 16:52:51

您看到的异常正在发生,因为您正在运行的平台上的运行时系统未实现 Package.getDeclaredAnnotations() 的本机代码方法。

根据此 Android 问题,Davlik 目前不支持 Package根本没有注释。例外就是一个征兆。

AFAIK,除了避免使用包注释之外,您无能为力。 (并动员您的亲朋好友投票支持解决问题!)

The exception you are seeing is happening because the native code method for Package.getDeclaredAnnotations() is not implemented by the runtime system on the platform you are running.

According to this android issue, Davlik currently doesn't support Package annotations at all. The exception is a symptom of that.

AFAIK, there's nothing you can do about it except avoid using Package annotations. (And mobilize your friends and relatives to vote for the issue to be fixed!)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文