我试图在我的Android应用程序中使用ICU-Project.org Library (ICU4J v55.1),它有很好的Java日历替代品,如日语和伊斯兰日历,但jar文件总是导致eclipse或我的应用程序崩溃
我无法在我的Android应用中使用它,但它在普通Java项目中100%正常工作,所以我不知道它是什么问题
第一次,我将jar文件复制到我的lib文件夹,然后右键单击>添加到构建路径
当我在Android模拟器中运行该应用时,此方法会导致使用以下消息对IDE进行查杀:
Unable to execute dex: Java heap space
Java heap space
虽然我已经增加了堆空间,如下所示,但没有解决:
--launcher.XXMaxPermSize
2048M
-showsplash
org.eclipse.platform
--launcher.XXMaxPermSize
2048m
--launcher.defaultAction
openFile
--launcher.appendVmargs
-vmargs
-Dosgi.requiredJavaVersion=1.6
-Xms2048m
-Xmx2048m
第二次:我已删除了jar文件,并将其添加(右键单击MyApp>属性> Java Build Path> Libraries选项卡>添加外部jar
在“订购和导出”选项卡中,未选中jar
现在当我运行Android模拟器时,它可以运行,但我的应用程序崩溃时出现以下错误:
08-27 18:46:06.635: I/dalvikvm(295): Could not find method com.ibm.icu.util.Calendar.getInstance, referenced from method com.c.cx.Main.onCreate
08-27 18:46:06.635: W/dalvikvm(295): VFY: unable to resolve static method 13898: Lcom/ibm/icu/util/Calendar;.getInstance ()Lcom/ibm/icu/util/Calendar;
08-27 18:46:06.665: D/dalvikvm(295): VFY: replacing opcode 0x71 at 0x0009
08-27 18:46:06.665: D/dalvikvm(295): VFY: dead code 0x000c-002b in Lcom/c/cx/Main;.onCreate (Landroid/os/Bundle;)V
08-27 18:46:06.805: D/AndroidRuntime(295): Shutting down VM
08-27 18:46:06.805: W/dalvikvm(295): threadid=1: thread exiting with uncaught exception (group=0x4001d800)
08-27 18:46:06.815: E/AndroidRuntime(295): FATAL EXCEPTION: main
08-27 18:46:06.815: E/AndroidRuntime(295): java.lang.NoClassDefFoundError: com.ibm.icu.util.Calendar
08-27 18:46:06.815: E/AndroidRuntime(295): at com.c.cx.Main.onCreate(Main.java:15)
08-27 18:46:06.815: E/AndroidRuntime(295): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
08-27 18:46:06.815: E/AndroidRuntime(295): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
08-27 18:46:06.815: E/AndroidRuntime(295): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
08-27 18:46:06.815: E/AndroidRuntime(295): at android.app.ActivityThread.access$2300(ActivityThread.java:125)
08-27 18:46:06.815: E/AndroidRuntime(295): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
08-27 18:46:06.815: E/AndroidRuntime(295): at android.os.Handler.dispatchMessage(Handler.java:99)
08-27 18:46:06.815: E/AndroidRuntime(295): at android.os.Looper.loop(Looper.java:123)
08-27 18:46:06.815: E/AndroidRuntime(295): at android.app.ActivityThread.main(ActivityThread.java:4627)
08-27 18:46:06.815: E/AndroidRuntime(295): at java.lang.reflect.Method.invokeNative(Native Method)
08-27 18:46:06.815: E/AndroidRuntime(295): at java.lang.reflect.Method.invoke(Method.java:521)
08-27 18:46:06.815: E/AndroidRuntime(295): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
08-27 18:46:06.815: E/AndroidRuntime(295): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
08-27 18:46:06.815: E/AndroidRuntime(295): at dalvik.system.NativeStart.main(Native Method)
我对lib的使用:
package com.c.cx;
import com.ibm.icu.util.Calendar;
import android.app.Activity;
import android.os.Bundle;
import android.widget.Toast;
public class Main extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Calendar cal = Calendar.getInstance();
Toast.makeText(getApplicationContext(), ""+cal.get(Calendar.YEAR), Toast.LENGTH_SHORT).show();
}
}
我的JDK版本:1.6,我已将其更改为1.7,没有解决。
请在判断之前先试试。
答案 0 :(得分:1)
嗯,ICU主要不是为Android而设计的。特别是两件事让我担心:
我也不确定在Android平台上使用类加载器加载资源是否是一种有效的机制。其他图书馆发现了与此主题相关的性能问题 - 例如Joda-Time-Android(特别是“#34;为什么选择此库?"”或Threeten-ABP。我有理由克隆我自己的名为Time4J / A的库,并使用资产文件作为资源将其重新架构为优化的aar-library。
关于你的注释,ICU的伊斯兰日历是非常好的"。我敢于有不同的意见。与Joda-Time一样,ICU的伊斯兰变体只是一种算法近似,但不能取代像沙特阿拉伯的umalqura-calendar那样的基于目击的变体。
更正:现在我看到ICU还声称从版本v52开始支持Umalqura(只知道旧版本)。所以ICU对伊斯兰日历的支持确实比大多数其他图书馆都要好。
从2015-08-31更新:
现在我的答案的积极部分(其第一部分相当消极 - 抱歉)。今天我发布了Time4A-v3.6-2015f。它包含了一个涵盖ICU4J支持的所有变体的Hijri日历。例如:
PlainDate today = SystemClock.inLocalView().today();
System.out.println(today); // 2015-08-31
HijriCalendar hijri = // conversion on local timeline at noon
today.transform(HijriCalendar.class, HijriCalendar.VARIANT_ICU4J);
System.out.println(hijri); // AH-1436-11-17[islamic-icu4j]
反向转换为格里高利日期很简单:
System.out.println(hijri.transform(PlainDate.class));
注意,Umalqura会显示1436-11-16。 ICU日历类型映射如下:
HijriCalendar.VARIANT_ICU4J => IslamicCalendar.CalculationType.ISLAMIC
HijriCalendar.VARIANT_UMALQURA => IslamicCalendar.CalculationType.ISLAMIC_UMALQURA
HijriAlgorithm.WEST_ISLAMIC_CIVIL => IslamicCalendar.CalculationType.ISLAMIC_CIVIL
HijriAlgorithm.WEST_ISLAMIC_ASTRO => IslamicCalendar.CalculationType.ISLAMIC_TBLA
使用ISLAMIC的天文ICU仿真的基础数据未在Time4J中重新计算,但仅使用简单的传输代码工具(基于ICU4j)取代,如:
IslamicCalendar cal = new IslamicCalendar(TimeZone.GMT, Locale.ROOT);
cal.clear();
cal.setCalculationType(IslamicCalendar.CalculationType.ISLAMIC);
for (int hyear = 1; hyear <= 1600; hyear++) {[
cal.set(Calendar.YEAR, hyear);
// here writing the islamic year in a data-file
for (int hmonth = 1; hmonth <= 12; hmonth++) {
cal.set(Calendar.MONTH, hmonth - 1); // zero-based-index
cal.set(Calendar.DAY_OF_MONTH, 1);
int len = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
if (hmonth > 1) {
// write a space into the file
}
// write the length of month in days
}
}
此代码确保Time4J在1-1600的年份范围内管理与ICU4J完全相同的数据。所以你应该可以用Time4A替换ICU4J(AAR库大约724kB)。我在Android Studio模拟器上测试过它。你真的不必害怕失去i18n功能。 Time4A支持45种语言,包括阿拉伯语,波斯语等伊斯兰时代和伊斯兰月的名称(基于CLDR-26)。格式示例显示在online-javadoc。
中