我正在尝试转换普通的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 code site here.)
我正在运行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)
编辑 - 新信息
由于终端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
答案 0 :(得分:3)
该错误意味着进行了JNI调用,但无法找到它试图绑定的本机函数。看起来像android.os.SystemProperties.get试图调用一个名为native_get的本机库函数来实际做一些工作。您是否已将项目库正确包含在项目中?
答案 1 :(得分:0)
我对堆栈跟踪中的com.htc.profileflag.ProfileConfig.<clinit>
条目持超级怀疑态度。我怀疑你的设备上的环境可能与terminal-ide所期望的略有不同,并且它没有为HTC特定的东西包含正确的jni库。
要检查这是否真的是特定于设备的问题,您可以尝试在模拟器中设置terminal-ide,并查看构建库时是否出现相同的错误。