java.lang.Package.getDeclaredAnnotations 上 UnsatisfiedLinkError 的极其简化的测试用例
为什么我在 标准 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您看到的异常正在发生,因为您正在运行的平台上的运行时系统未实现
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!)