• Global community
    • Language:
      • Deutsch
      • English
      • Español
      • Français
      • Português
  • 日本語コミュニティ
    Dedicated community for Japanese speakers
  • 한국 커뮤니티
    Dedicated community for Korean speakers
Exit
Locked
0

Big ANE causes java.lang.OutOfMemoryError when packaging Air application

Guest
Aug 10, 2012 Aug 10, 2012

Copy link to clipboard

Copied

Hi,

I'm working on an Air mobile game that uses ANE on iOS and Android. I'm in the process of creating a new ANE and face a problem on the Android side.

My ANE requires an external framework (Burstly, http://burstly.com). If I just link the Android project to Burstly's .jar file, I get errors in "adb logcat", like:

I/dalvikvm(16074): Could not find method com.burstly.lib.BurstlySdk.init, referenced from method com.freshplanet.burstly.functions.InitBurstlyFunction.call

In order to include Burstly's files in my own .jar, I unzip Burstly's .jar file and repackage them with my compiled code in a unique .jar (following advice on http://stackoverflow.com/questions/7732742/air-3-native-extensions-for-android-can-i-how-to-include-...).

Problem: Burstly's SDK includes thousands of files. It doesn't create any trouble when packaging the ANE, but when I try to package the Air application, I get the following error:

dx tool failed:

UNEXPECTED TOP-LEVEL ERROR:

java.lang.OutOfMemoryError: Java heap space

          at com.android.dx.util.IntList.<init>(IntList.java:87)

          at com.android.dx.rop.code.RopMethod.calcPredecessors(RopMethod.java:174)

          at com.android.dx.rop.code.RopMethod.labelToPredecessors(RopMethod.java:95)

          at com.android.dx.ssa.back.IdenticalBlockCombiner.process(IdenticalBlockCombiner.java:74)

          at com.android.dx.ssa.back.SsaToRop.convert(SsaToRop.java:132)

          at com.android.dx.ssa.back.SsaToRop.convertToRopMethod(SsaToRop.java:76)

          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:299)

          at com.android.dx.command.dexer.Main.processFileBytes(Main.java:278)

          at com.android.dx.command.dexer.Main.access$100(Main.java:56)

          at com.android.dx.command.dexer.Main$1.processFileBytes(Main.java:229)

          at com.android.dx.cf.direct.ClassPathOpener.processArchive(ClassPathOpener.java:244)

          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: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)

I read that the solution to eliminate this error is to give Java the parameters "-Xms...M -Xmx...M", with "..." being a high-enough number. Note that I'm working on a machine with 8GB of RAM. I tried to package the app in command line to be able to pass these parameters:

/usr/bin/java -Xms512M -Xmx4096M -jar "/Applications/Adobe Flash Builder 4.6/sdks/4.6.0air31/lib/adt.jar" -package -target apk -storetype pkcs12 -keystore [...].p12 Main.apk Main-app.xml Main.swf -extdir "/Users/alex/Documents/Adobe Flash Builder 4.6/.metadata/.plugins/com.adobe.flexbuilder.project.ui/ANEFiles/front-end-mobile/com.adobe.flexide.multiplatform.ios.platform"

But when I run a "ps -ef | grep java", I can see that adt runs another Java program (dx) without transmitting my -Xms -Xmx parameters:

/usr/bin/java -jar /Applications/Adobe Flash Builder 4.6/sdks/4.6.0air31/lib/android/bin/dx.jar --dex --output=/private/var/folders/t9/3kw74cx14nv2xg9tgmx9m1jc0000gp/T/b5757d93-1e93-439c-8f6d-c93e4933f6f1/outputDEX.dex [... bunch of jars]

Any idea to solve this issue?

Thanks

Alex

TOPICS
Development

Views

7.2K

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Guest
Aug 24, 2012 Aug 24, 2012

Copy link to clipboard

Copied

I solved my issue by setting the _JAVA_OPTIONS environment variable. (Note: there are two underscores)

I added the following line to my .bash_profile:

export _JAVA_OPTIONS="-Xms1024m -Xmx4096m -XX:MaxPermSize=512m"

Now everytime a Java program is launched from the command line, I see the following message:

Picked up _JAVA_OPTIONS: -Xms1024m -Xmx4096m -XX:MaxPermSize=512m

And my application packaging runs just fine now.

I still have an issue though: this trick solved the problem for packaging the app from the command line, but the _JAVA_OPTIONS are not picked up when packaging from Flash Builder, so it still crashes there.

Note that my Adobe Flash Builder 4.6.ini contains the following options:

-Xms512m

-Xmx1676m

-XX:MaxPermSize=512m

-XX:PermSize=64m

1676m is the highest number I can put before Flash Builder refuses to launch. I'm not sure if these parameters are actually passed to the VM that runs de dx.jar program, or if it's just for the ActionScript compiler. But anyway my app packaging still crashes in Flash Builder.

If someone knows a way to force Flash Builder to pickup the _JAVA_OPTIONS set in the command line, let me know 🙂

Thanks

Alex

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
New Here ,
Oct 22, 2013 Oct 22, 2013

Copy link to clipboard

Copied

If you want your IDE to pick up any _JAVA_OPTIONS simply add the options straight to the ADT file (bin/adt for mac, bin/adt.bat for windows).

e.g. export _JAVA_OPTIONS="-Xms1024m -Xmx4096m -XX:MaxPermSize=512m"

I'm using FDT and after adding the above line to adt it's picking up the increased memory size.

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
New Here ,
Jun 25, 2015 Jun 25, 2015

Copy link to clipboard

Copied

LATEST

Hi Alex,

Did you have find a solution to fix this Issue? I also meet the same problem. Can you tell me how you to fix it. I'm appreciate that!

Votes

Translate

Translate

Report

Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines