db-derby-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Dan Bornstein (JIRA)" <j...@apache.org>
Subject [jira] Commented: (DERBY-4458) Dalvik / Andoid compatibility
Date Wed, 02 Dec 2009 18:10:20 GMT

    [ https://issues.apache.org/jira/browse/DERBY-4458?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12784937#action_12784937
] 

Dan Bornstein commented on DERBY-4458:
--------------------------------------

Hi. I'm the Dalvik engineer referred to above. In fact, I believe the bytecode spec changed
between 1.4 and 1.5. dx's warning is basically saying that 1.4-based code that uses inner
classes doesn't provide enough information for a 1.5 runtime to faithfully report about them
via reflection. Rather than try to halfway reconstruct the reflection info in such cases,
dx just gives up and ignores inner classes info entirely. If your code doesn't make reflection
calls to look at inner class stuff, then none of this makes any difference.

Also, if dx is running out of memory, you can tell it to have a larger maximum heap size by
using a passthrough option for the underlying vm that runs dx, e.g. "dx -JXmx2048m ...".

Also also, while the Dalvik vm doesn't read .class files directly, you can in fact synthesize
.dex files and use them, in a similar manner. I have seen a proof of concept where someone
generated .class files, ran them through dx (treated as a library), and then loaded the result.
It works, but it is admittedly not pretty, especially since the dx code isn't particularly
geared for use in a memory-constrained environment (see above). In the long run, you'd be
better off generating .dex files more directly, but it might at least unblock you.

Cheers!

-dan


> Dalvik / Andoid compatibility
> -----------------------------
>
>                 Key: DERBY-4458
>                 URL: https://issues.apache.org/jira/browse/DERBY-4458
>             Project: Derby
>          Issue Type: Improvement
>    Affects Versions: 10.5.3.0
>         Environment: dx 1.2 (from the Android SDK 2.0) running on Java 1.6
>            Reporter: Thomas Görres
>            Priority: Blocker
>
> derby.jar cannot be used on mobile devices running the Android OS. Android uses Dalvik
as runtime environment, and the classfiles from derby.jar cannot be translated to Dalvik byte
code.
> Steps to repeat:
> 1. get the Android SDK from http://developer.android.com
> 2. navigate to [android-sdk]/platforms/android-1.5/tools
> 3. execute ./dx --dex path/to/derby.jar
> The dx tool should convert the JRE byte code to Dalvik byte code. Instead, it spits out
this warning several time:
> warning: Ignoring InnerClasses attribute for an anonymous inner class that doesn't come
with an associated EnclosingMethod attribute. (This class was probably produced by a broken
compiler.)
> Then it runs out of memory:
> java.lang.OutOfMemoryError: Java heap space
> 	at com.android.dx.rop.code.ThrowingInsn.withNewRegisters(ThrowingInsn.java:116)
> 	at com.android.dx.ssa.NormalSsaInsn.toRopInsn(NormalSsaInsn.java:122)
> 	at com.android.dx.ssa.back.SsaToRop.convertInsns(SsaToRop.java:386)
> 	at com.android.dx.ssa.back.SsaToRop.convertBasicBlock(SsaToRop.java:365)
> 	at com.android.dx.ssa.back.SsaToRop.convertBasicBlocks(SsaToRop.java:300)
> 	at com.android.dx.ssa.back.SsaToRop.convertToRop(SsaToRop.java:277)
> 	at com.android.dx.ssa.back.SsaToRop.convert(SsaToRop.java:118)
> 	at com.android.dx.ssa.back.SsaToRop.convertToRopMethod(SsaToRop.java:71)
> 	at com.android.dx.ssa.Optimizer.optimize(Optimizer.java:103)
> 	at com.android.dx.ssa.Optimizer.optimize(Optimizer.java:74)
> 	at com.android.dx.dex.cf.CfTranslator.processMethods(CfTranslator.java:269)
> 	at com.android.dx.dex.cf.CfTranslator.translate0(CfTranslator.java:131)
> 	at com.android.dx.dex.cf.CfTranslator.translate(CfTranslator.java:85)
> 	at com.android.dx.command.dexer.Main.processClass(Main.java:297)
> 	at com.android.dx.command.dexer.Main.processFileBytes(Main.java:276)
> 	at com.android.dx.command.dexer.Main.access$100(Main.java:56)
> 	at com.android.dx.command.dexer.Main$1.processFileBytes(Main.java:228)
> 	at com.android.dx.cf.direct.ClassPathOpener.processArchive(ClassPathOpener.java:245)
> 	at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:130)
> 	at com.android.dx.cf.direct.ClassPathOpener.process(ClassPathOpener.java:108)
> 	at com.android.dx.command.dexer.Main.processOne(Main.java:245)
> 	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:87)

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


Mime
View raw message