我正在尝试转换一个正常的Java应用程序库用于Android。该库从Java 1.1开始,一直在维护、改进等,并且在其他平台上提供服务,因此不太可能涉及源代码。
通常,由于部署的细节,这个库没有封装在jar中,而只是保存在树中,在那里CLASSPATH发挥它的魔力。然而,为了把它放到Android上,我们创建了一个jar。一切正常——没有警告或错误。
由于将有一些新的开发-因此调试-通过ProGuard处理的步骤被跳过-时间将在稍后到来。
错误出现在下一步,运行dx将其转换为Android使用。直到这里描述的致命错误出现之前,处理过程都不会出错。(有一个小警告)
错误提示:
UNEXPECTED TOP-LEVEL ERROR:
java.lang.ExceptionInInitializerError
at java.io.ByteArrayOutputStream.expand(ByteArrayOutputStream.java:91)
at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:201)
at com.android.dx.cf.direct.ClassPathOpener.processArchive(ClassPathOpener.java:244)
at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:136)
at com.android.dx.cf.direct.ClassPathOpener.process(ClassPathOpener.java:113)
at com.android.dx.command.dexer.Main.processOne(Main.java:247)
at com.android.dx.command.dexer.Main.processAllFiles(Main.java:183)
at com.android.dx.command.dexer.Main.run(Main.java:139)
at com.android.dx.command.dexer.Main.main(Main.java:120)
at com.android.dx.command.Main.main(Main.java:89)
at com.spartacusrex.spartacuside.external.dx.main(dx.java:14)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.UnsatisfiedLinkError: native_get
at android.os.SystemProperties.native_get(Native Method)
at android.os.SystemProperties.get(SystemProperties.java:47)
at com.htc.profileflag.ProfileConfig.<clinit>(ProfileConfig.java:168)
... 12 more
开发环境为Terminal-IDE。(Google代码站点在这里)
我正在运行Terminal-IDE v 2.02 -最新的。我的Android版本是:
Android 4.0.3
Software version 2.14.531.3 71ORD
(the rest aren't likely pertinent, but more on request)
EDIT - New Information
考虑到Terminal-IDE环境中缺少一些东西,我开始尝试在运行Eclipse的Windows 7机器上运行dx。Eclipse 正在以某种方式运行DX,因为它将代码从普通的.jar转换为实际作为Android应用程序一部分运行的东西。然而,我不能让dx从命令行运行-它抱怨它找不到源输入文件!(有什么线索吗?)
同时,在某人的建议下,我开始在Terminal-IDE环境中进行整个构建。这意味着需要进行一些黑客操作来简化场景,而且它总是因为找不到java而失败。RMI,所以我注释了这些部分-我假设有一个Android-Ready RMI库我可以只是指向?...继续,一切都正常工作,没有错误,直到我再次使用DX,出现了上面报告的非常类似的错误:
UNEXPECTED TOP-LEVEL ERROR:
java.lang.ExceptionInInitializerError
at com.android.dx.util.FileUtils.readFile(FileUtils.java:72)
at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:139)
at com.android.dx.cf.direct.ClassPathOpener.processDirectory(ClassPathOpener.java:196)
at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:127)
at com.android.dx.cf.direct.ClassPathOpener.processDirectory(ClassPathOpener.java:196)
at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:127)
at com.android.dx.cf.direct.ClassPathOpener.process(ClassPathOpener.java:113)
at com.android.dx.command.dexer.Main.processOne(Main.java:247)
at com.android.dx.command.dexer.Main.processAllFiles(Main.java:183)
at com.android.dx.command.dexer.Main.run(Main.java:139)
at com.android.dx.command.dexer.Main.main(Main.java:120)
at com.android.dx.command.Main.main(Main.java:89)
at com.spartacusrex.spartacuside.external.dx.main(dx.java:14)
at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.UnsatisfiedLinkError: native_get
at android.os.SystemProperties.native_get(Native Method)
at android.os.SystemProperties.get(SystemProperties.java:47)
at com.htc.profileflag.ProfileConfig.<clinit>(ProfileConfig.java:168)
... 14 more
这个bug意味着发出了一个JNI调用,它找不到它试图绑定的本机函数。看起来android.os.SystemProperties.get试图调用一个名为native_get的本地库函数来实际做一些工作。您是否将库正确地包含在项目中?
我对堆栈跟踪中的com.htc.profileflag.ProfileConfig.<clinit>
条目非常怀疑。我怀疑也许你的设备上的环境与终端ide所期望的略有不同,并且它没有包含正确的jni库,无论HTC特定的东西是什么。
要检查这是否真的是设备特定的问题,您可以尝试在模拟器中设置终端,看看在构建库时是否会得到相同的错误。