Quick Start ----------- on Linux: $ export JAVA_HOME=/usr/local/java # or wherever you have the JDK installed $ make $ build/linux-i386-compile-fast/avian -cp build/test Hello on Mac OS X: $ export JAVA_HOME=/Library/Java/Home $ make $ build/darwin-i386-compile-fast/avian -cp build/test Hello on Windows (MSYS): $ export JAVA_HOME="C:/Program Files/Java/jdk1.6.0_07" $ make $ build/windows-i386-compile-fast/avian -cp build/test Hello on Windows (Cygwin): $ export JAVA_HOME="/cygdrive/c/Program Files/Java/jdk1.6.0_07" $ make $ build/windows-i386-compile-fast/avian -cp build/test Hello Adjust JAVA_HOME according to your system, but be sure to use forward slashes in the path. Introduction ------------ Avian is a lightweight virtual machine and class library designed to provide a useful subset of Java's features, suitable for building self-contained applications. More information is available at the project web site: http://oss.readytalk.com/avian If you have any trouble building, running, or embedding Avian, please post a message to our discussion group: http://groups.google.com/group/avian That's also the place for any other questions, comments, or suggestions you might have. Supported Platforms ------------------- Avian can currently target the following platforms: Linux (i386 and x86_64) Win32 (i386) Mac OS X (i386) Building -------- Build requirements include: * GNU make 3.80 or later * GCC 3.4 or later * JDK 1.5 or later * GNU binutils 2.17 or later (not needed on OS X) * MinGW 3.4 or later (only if cross-compiling for Windows) * zlib 1.2.3 or later Earlier versions of some of these packages may also work but have not been tested. The build is directed by a single makefile and may be influenced via certain flags described below. $ make platform={linux,windows,darwin} arch={i386,x86_64} \ process={compile,interpret} mode={debug,debug-fast,fast,small} * platform - the target platform default: output of $(uname -s | tr [:upper:] [:lower:]) * arch - the target architecture default: output of $(uname -m) * mode - which set of compilation flags to use, which determine optimization level, debug symbols, and whether to enable assertions default: fast * process - choice between pure interpreter or JIT compiler default: compile If you are compiling for Windows, you may either cross-compile using MinGW or build natively on Windows under MSYS or Cygwin. Installing MSYS: 1. Download and install the current MinGW and MSYS packages from mingw.org, selecting the C and C++ compilers when prompted. Use the post-install script to create the filesystem link to the compiler. 2. Download GNU Make 3.81 from the MSYS download page (make-3.81-MSYS-1.0.11-2.tar.bz2) and extract the tar file into e.g. c:/msys/1.0. Installing Cygwin: 1. Download and run setup.exe from cygwin.com, installing the base system and these packages: make, gcc-mingw-g++, and (optionally) git. You may also find our win32 repository useful: (run this from the directory containing the avian directory) $ git clone git://oss.readytalk.com/win32.git This gives you the Windows JNI headers, zlib headers and library, and a few other useful libraries like OpenSSL and libjpeg. Installing ---------- $ cp build/${platform}-${arch}-${process}-${mode}/avian ~/bin/ Embedding --------- The following series of commands illustrates how to produce a stand-alone executable out of a Java application using Avian. Note: if you are building on Cygwin, add -mno-cygwin to each of the compile and link commands below. Step 1: Build Avian, create a new directory, and populate it with the VM object files and bootstrap classpath jar. $ make $ mkdir hello $ cd hello $ ar x ../build/${platform}-${arch}-${process}-${mode}/libavian.a $ cp ../build/classpath.jar boot.jar Step 2: Build the Java code and add it to the jar. $ cat >Hello.java < boot-jar.o Step 4: Write a driver which starts the VM and runs the desired main method. Note the bootJar function, which will be called by the VM to get a handle to the embedded jar. We tell the VM about this jar by setting the classpath to "[bootJar]". $ cat >main.cpp <("-Djava.class.path=[bootJar]"); JavaVM* vm; void* env; JNI_CreateJavaVM(&vm, &env, &vmArgs); JNIEnv* e = static_cast(env); jclass c = e->FindClass("Hello"); if (not e->ExceptionOccurred()) { jmethodID m = e->GetStaticMethodID(c, "main", "([Ljava/lang/String;)V"); if (not e->ExceptionOccurred()) { jclass stringClass = e->FindClass("java/lang/String"); if (not e->ExceptionOccurred()) { jobjectArray a = e->NewObjectArray(ac-1, stringClass, 0); if (not e->ExceptionOccurred()) { for (int i = 1; i < ac; ++i) { e->SetObjectArrayElement(a, i-1, e->NewStringUTF(av[i])); } e->CallStaticVoidMethod(c, m, a); } } } } int exitCode = 0; if (e->ExceptionOccurred()) { exitCode = -1; e->ExceptionDescribe(); } vm->DestroyJavaVM(); return exitCode; } EOF on Linux: $ g++ -I$JAVA_HOME/include -I$JAVA_HOME/include/linux \ -D_JNI_IMPLEMENTATION_ -c main.cpp -o main.o on Mac OS X: $ g++ -I$JAVA_HOME/include -D_JNI_IMPLEMENTATION_ -c main.cpp -o main.o on Windows: $ g++ -I$JAVA_HOME/include -I$JAVA_HOME/include/win32 \ -D_JNI_IMPLEMENTATION_ -c main.cpp -o main.o Step 5: Link the objects produced above to produce the final executable, and optionally strip its symbols. on Linux: $ g++ -rdynamic *.o -ldl -lpthread -lz -o hello $ strip --strip-all hello on Mac OS X: $ g++ -rdynamic *.o -ldl -lpthread -lz -o hello -framework CoreFoundation $ strip -S -x hello on Windows: $ dlltool -z hello.def *.o $ dlltool -d hello.def -e hello.exp $ g++ hello.exp *.o -L../../win32/lib -lmingwthrd -lm -lz -lws2_32 \ -mwindows -mconsole -o hello.exe $ strip --strip-all hello.exe