Java dx工具:意外的顶层错误 java.lang.ExceptionInInitializerError

3

我正在尝试将一个普通的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)

编辑 - 新信息

由于在 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

是的,正如Gabe所指出的那样,这相对简单,至少知道故障的原因。在运行类初始化器时,发生了UnsatisfiedLinkError,试图引用本地方法“native_get”。这可能表明您的库路径存在问题(因为那里是您找到本地方法的地方)。 - Hot Licks
2个回答

3

那个bug的意思是JNI调用被执行,但它找不到想要绑定的本地函数。看起来android.os.SystemProperties.get试图调用一个名为native_get的本地库函数来实际完成一些工作。你在项目中是否正确地包含了这个库?


你在项目中正确地包含了这个库吗?我敢肯定你没有!我注意到一些环境变量的差异值得更深入地研究。感谢您的评论。 - Richard T
在仔细阅读您的评论后,我意识到可能没有表达清楚我的意思,即我正在构建本身库。它只包含标准Java依赖项(包括)。我知道有一个未包含的依赖项(java.rmi),但我决定将其注释掉,因为RMI不是此代码关键部分。至少目前为止,所有环境变量详细信息都未得出结果。 - Richard T

0

我非常怀疑你堆栈跟踪里的com.htc.profileflag.ProfileConfig.<clinit>。我怀疑你设备上的环境可能与terminal-ide期望的略有不同,而且它没有包含正确的jni库来处理那个HTC特定的事情。

为了检查这是否真的是设备特定的问题,您可以尝试在模拟器中设置terminal-ide并查看构建库时是否出现相同的错误。


你可能对我的环境与Terminal-IDE的期望有所发现,但我不知道如何模拟构建!(我对Android相当新 - 我已经在仿真中运行了自己的应用程序,但是_build_环境呢?嗯...) - Richard T
这与在您自己的设备上运行终端IDE没有任何区别 - 您启动Android模拟器,安装终端IDE,复制项目并尝试构建,就像在设备上一样。 - JesusFreke
昨天我花了好几个小时试图在基于Windows-7的Eclipse开发环境中安装terminal-ide到Android模拟器上;尽管我尝试了很多方法,但我无法找到一种方法来将一个非项目创建的应用程序安装到模拟器中。没有“安装”功能!我甚至使用更新工具更新了安装 - 仍然没有成功。 - Richard T
什么?你可以像在设备上一样使用adb在模拟器上安装应用程序。 - JesusFreke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接