Found this very useful when i was trying out the JNI under android (Short Story – Could not get it to work!).
Step #1: Start with a simple java class
package org.apache; public class HelloWorld { public static void main(String[] args) { System.out.println("Hello World!"); } }
Compile the java class
C:\android\CmdLine>javac -d . -g Helloworld.java
Step #2: Package the generated classes into a temporary jar
C:\android\CmdLine>jar -cvf Temp.jar * added manifest adding: Hello.java(in = 0) (out= 0)(stored 0%) adding: HelloWorld.java(in = 149) (out= 122)(deflated 18%) adding: org/(in = 0) (out= 0)(stored 0%) adding: org/apache/(in = 0) (out= 0)(stored 0%) adding: org/apache/HelloWorld.class(in = 556) (out= 344)(deflated 38%)
Step #3: Use the “dx” tool to generate a classes.dex from our temporary jar.
C:\android\CmdLine>dx --dex --output=c:/android/CmdLine/classes.dex c:/android/CmdLine/Temp.jar
Step #4: Use the “aapt” tool to create a new jar suitable for use with dalvikvm
C:\android\CmdLine>aapt add CmdLine.jar classes.dex 'classes.dex'...
and push it into a known location on the emulator
C:\android\CmdLine>adb push CmdLine.jar /data 30 KB/s (0 bytes in 481.000s)
Step #5: kick the tires of dalvikvm
C:\android\CmdLine>adb shell # /system/bin/dalvikvm -Xbootclasspath:/system/framework/core.jar -version /system/bin/dalvikvm -Xbootclasspath:/system/framework/core.jar -version DalvikVM version 0.2.0 Copyright (C) 2007 Google, Inc. Blah blah blah LICENSE blah blah. Dalvik VM init failed (check log file)
Step #6: Run our code
# /system/bin/dalvikvm -Xbootclasspath:/system/framework/core.jar -classpath /data/CmdLine.jar org.apache.HelloWorld /system/bin/dalvikvm -Xbootclasspath:/system/framework/core.jar -classpath /data/CmdLine.jar org.apache.HelloWorld Hello World!
Good example and clear instructions, but it doesn’t run if you try to instantiate the class in the main function to do advanced stuff (like have a finalize clause). An error occurs when I attempted to do this:
Dalvik VM unable to find static main(String[]) …
Using Android 1.6.
Comment by Ryan Page — November 20, 2009 @ 12:28 pm
This doesnt make J2ME jars to be run on android is it?
only simple java jars run on this dalvik java
Comment by sparco — February 23, 2010 @ 2:19 am
What would be the additional steps needed if the HelloWorld program needs to refer to external classes/packages?
Comment by Stephen — May 24, 2011 @ 10:48 am
I’m having severe problems with my mobile and being redirected to other web sights..
Comment by David Burgess — March 27, 2012 @ 2:08 am
Two additional points that were needed for me:
1) Run dalvikvm as root, otherwise you don’t have permission to write to /data/dalvikvm-cache
$ su –
2) add the required LD_LIBRARY_PATH for dalvikvm:
# export LD_LIBRARY_PATH=/system/lib
3) run the vm
# /system/bin/dalvikvm -Xbootclasspath:/system/framework/core.jar -classpath /data/CmdLine.jar org.apache.HelloWorld
To discover this:
$ logcat *:S dalvikvm:D
1)
8<————————————————————————
E/dalvikvm( 3400): Dex cache directory isn't writable: /data/dalvik-cache
I/dalvikvm( 3400): Unable to open or create cache for Hello2.jar (/data/dalvik-cache/storage@sdcard0@tmp@Hello2.jar@classes.dex)
8<————————————————————————
2)
8<————————————————————————
D/dalvikvm( 4927): Trying to load lib libjavacore.so 0x0
D/dalvikvm( 4927): Added shared lib libjavacore.so 0x0
D/dalvikvm( 4927): Trying to load lib libnativehelper.so 0x0
D/dalvikvm( 4927): Added shared lib libnativehelper.so 0x0
W/dalvikvm( 4927): Exception Ljava/lang/NullPointerException; thrown while initializing Ljava/lang/System;
8<————————————————————————
Comment by vanrenter — December 8, 2013 @ 8:39 am