Quick Start ----------- $ make $ build/linux-i386-compile-fast/avian -cp build/test Hello Supported Platforms ------------------- Avian can currently target the following platforms: Linux (i386 and x86_64) Win32 (i386) Mac OS X (i386) The Win32 port may be built on Linux using a MinGW cross compiler and build environment. Builds on MSYS or Cygwin are not yet supported, but patches to enable them are welcome. Building -------- 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} * 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 Installing ---------- $ cp build/${platform}-${arch}-${process}-${mode}/avian ~/bin/ $ cp build/${platform}-${arch}-${process}-${mode}/libavian.a ~/lib/ Embedding --------- The following series of commands illustrates how to produce a stand-alone executable out of a Java application using Avian. Step 1: Build the Java code and jar it up. $ cat >Hello.java < hello-jar.o Step 3: Write a driver which starts the VM and runs the desired main method. Note the helloJar 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 "[helloJar]". $ cat >main.cpp <(SYMBOL(size)); return SYMBOL(start); } } // extern "C" #ifdef JNI_VERSION_1_6 typedef struct JDK1_1InitArgs { jint version; char **properties; jint checkSource; jint nativeStackSize; jint javaStackSize; jint minHeapSize; jint maxHeapSize; jint verifyMode; char *classpath; jint (JNICALL *vfprintf)(FILE *fp, const char *format, va_list args); void (JNICALL *exit)(jint code); void (JNICALL *abort)(void); jint enableClassGC; jint enableVerboseGC; jint disableAsyncGC; jint verbose; jboolean debugging; jint debugPort; } JDK1_1InitArgs; #endif int main(int ac, const char** av) { JDK1_1InitArgs vmArgs; vmArgs.version = 0x00010001; JNI_GetDefaultJavaVMInitArgs(&vmArgs); vmArgs.classpath = const_cast("[helloJar]"); JavaVM* vm; void* env; JNI_CreateJavaVM(&vm, &env, &vmArgs); JNIEnv* e = static_cast(env); jclass c = e->FindClass(MAIN_CLASS); 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 $ g++ -c main.cpp -o main.o Step 4: Link the above with libavian.a to produce the final executable. $ g++ hello-jar.o main.o -lavian -o hello