From 5afb5803a9d4d47ddb4f08029ea3245f6748cf80 Mon Sep 17 00:00:00 2001 From: Joel Dice Date: Tue, 19 Feb 2008 17:09:37 -0700 Subject: [PATCH] flesh out readme.txt, including instructions for embedding a custom application --- readme.txt | 170 +++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 164 insertions(+), 6 deletions(-) diff --git a/readme.txt b/readme.txt index 754d54530a..97058164ea 100644 --- a/readme.txt +++ b/readme.txt @@ -22,15 +22,25 @@ 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,fast} + process={compile,interpret} mode={debug,debug-fast,fast} -The default values of the build flags are as follows: + * platform - the target platform + default: output of $(uname -s | tr [:upper:] [:lower:]) - platform=$(uname -s | tr [:upper:] [:lower:]) - arch=$(uname -m) - mode=fast - process=compile + * 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 @@ -38,3 +48,151 @@ 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