in src/native/windows/src/javajni.c [1020:1099]
static DWORD WINAPI __apxJavaWorkerThread(LPVOID lpParameter)
{
#define WORKER_EXIT(x) do { rv = x; goto finished; } while(0)
DWORD rv = 0;
LPAPXJAVAVM lpJava = NULL;
LPAPXJAVA_THREADARGS pArgs = (LPAPXJAVA_THREADARGS)lpParameter;
APXHANDLE hJava;
hJava = (APXHANDLE)pArgs->hJava;
if (hJava->dwType != APXHANDLE_TYPE_JVM)
WORKER_EXIT(1);
lpJava = APXHANDLE_DATA(pArgs->hJava);
if (!lpJava)
WORKER_EXIT(1);
if (!apxJavaInitialize(pArgs->hJava,
pArgs->szClassPath,
pArgs->lpOptions, pArgs->lpOptions9,
pArgs->dwMs, pArgs->dwMx, pArgs->dwSs,
pArgs->bJniVfprintf)) {
WORKER_EXIT(2);
}
if (pArgs->szLibraryPath && *pArgs->szLibraryPath) {
DYNLOAD_FPTR_ADDRESS(SetDllDirectoryW, KERNEL32);
DYNLOAD_CALL(SetDllDirectoryW)(pArgs->szLibraryPath);
apxLogWrite(APXLOG_MARK_DEBUG "DLL search path set to '%S'",
pArgs->szLibraryPath);
}
/* System.out/System.err streams must be replaced before loading the main class. */
/* Otherwise both old and new streams may be used by the Java application, corrupting the log file. */
apxJavaSetOut(pArgs->hJava, TRUE, pArgs->szStdErrFilename);
apxJavaSetOut(pArgs->hJava, FALSE, pArgs->szStdOutFilename);
if (!apxJavaLoadMainClass(pArgs->hJava,
pArgs->szClassName,
pArgs->szMethodName,
pArgs->lpArguments)) {
WORKER_EXIT(3);
}
/* Check if we have a class and a method */
if (!lpJava->clWorker.jClazz || !lpJava->clWorker.jMethod) {
WORKER_EXIT(4);
}
if (!__apxJvmAttach(lpJava)) {
WORKER_EXIT(5);
}
apxLogWrite(APXLOG_MARK_DEBUG "Java worker thread started for %s:%s",
lpJava->clWorker.sClazz, lpJava->clWorker.sMethod);
lpJava->dwWorkerStatus = 1;
SetEvent(lpJava->hWorkerInit);
/* Ensure apxJavaStart worker has read our status */
WaitForSingleObject(lpJava->hWorkerSync, INFINITE);
apxLogWrite(APXLOG_MARK_DEBUG "JNI calling static void method %s:%s",
lpJava->clWorker.sClazz, lpJava->clWorker.sMethod);
JNICALL_3(CallStaticVoidMethod,
lpJava->clWorker.jClazz,
lpJava->clWorker.jMethod,
lpJava->clWorker.jArgs);
if (JVM_EXCEPTION_CHECK(lpJava)) {
apxLogWrite(APXLOG_MARK_DEBUG "Exception has been thrown");
vmExitCode = 1;
(*((lpJava)->lpEnv))->ExceptionDescribe((lpJava)->lpEnv);
__apxJvmDetach(lpJava);
WORKER_EXIT(6);
}
else {
__apxJvmDetach(lpJava);
}
finished:
if (lpJava) {
lpJava->dwWorkerStatus = 0;
apxLogWrite(APXLOG_MARK_DEBUG "Java worker thread finished %s:%s with status = %d",
lpJava->clWorker.sClazz, lpJava->clWorker.sMethod, rv);
SetEvent(lpJava->hWorkerInit);
}
ExitThread(rv);
/* Never gets here but keep the compiler happy */
return rv;
}