in src/native/unix/native/java.c [133:356]
bool java_init(arg_data *args, home_data *data)
{
#ifdef OS_DARWIN
dso_handle apph = NULL;
char appf[1024];
struct stat sb;
#endif /* ifdef OS_DARWIN */
jvm_create_t symb = NULL;
JNINativeMethod nativemethods[2];
JavaVMOption *opt = NULL;
dso_handle libh = NULL;
JavaVMInitArgs arg;
char *libf = NULL;
jint ret;
int x;
char loaderclass[] = LOADER;
char shutdownmethod[] = "shutdown";
char shutdownparams[] = "(Z)V";
char failedmethod[] = "failed";
char failedparams[] = "(Ljava/lang/String;)V";
char daemonprocid[64];
/* Decide WHAT virtual machine we need to use */
libf = java_library(args, data);
if (libf == NULL) {
log_error("Cannot locate JVM library file");
return false;
}
/* Some Java options require environment variables to be set before loading
* Java when using JNI
*/
for (x = 0; x < args->onum; x++) {
if (!strncmp(args->opts[x], "-XX:NativeMemoryTracking=", 25)) {
fprintf(stdout, "Found [%s]\n", args->opts[x]);
char *value = args->opts[x] + 25;
fprintf(stdout, "Found value [%s]\n", value);
if (strcmp(value, "off")) {
snprintf(daemonprocid, sizeof(daemonprocid), "NMT_LEVEL_%d=%s", (int)getpid(), value);
fprintf(stdout, "Setting environment entry [%s]\n", daemonprocid);
putenv(daemonprocid);
}
}
}
/* Initialize the DSO library */
if (dso_init() != true) {
log_error("Cannot initialize the dynamic library loader");
return false;
}
/* Load the JVM library */
#if !defined(OSD_POSIX)
libh = dso_link(libf);
if (libh == NULL) {
log_error("Cannot dynamically link to %s", libf);
log_error("%s", dso_error());
return false;
}
log_debug("JVM library %s loaded", libf);
#endif
#ifdef OS_DARWIN
/*
MacOS/X actually has two libraries, one with the REAL vm, and one for
the VM startup.
- JVM 1.6, the library name is libverify.dylib
- JVM 1.7 onwards, the library name is libjli.dylib
*/
if (replace(appf, 1024, "$JAVA_HOME/../Libraries/libverify.dylib",
"$JAVA_HOME", data->path) != 0) {
log_error("Cannot replace values in loader library");
return false;
}
if (stat(appf, &sb)) {
if (replace(appf, 1024, "$JAVA_HOME/../MacOS/libjli.dylib", "$JAVA_HOME", data->path) != 0) {
log_error("Cannot replace values in loader library");
return false;
}
}
// DAEMON-331 Alternative path for custom OpenJDK builds
if (stat(appf, &sb)) {
if (replace(appf, 1024, "$JAVA_HOME/lib/jli/libjli.dylib", "$JAVA_HOME", data->path) != 0) {
log_error("Cannot replace values in loader library");
return false;
}
}
apph = dso_link(appf);
if (apph == NULL) {
log_error("Cannot load required shell library %s", appf);
return false;
}
log_debug("Shell library %s loaded", appf);
#endif /* ifdef OS_DARWIN */
#if defined(OSD_POSIX)
/* BS2000 does not allow to call JNI_CreateJavaVM indirectly */
#else
symb = (jvm_create_t) dso_symbol(libh, "JNI_CreateJavaVM");
if (symb == NULL) {
#ifdef OS_DARWIN
symb = (jvm_create_t) dso_symbol(apph, "JNI_CreateJavaVM");
if (symb == NULL) {
#endif /* ifdef OS_DARWIN */
log_error("Cannot find JVM library entry point");
return false;
#ifdef OS_DARWIN
}
#endif /* ifdef OS_DARWIN */
}
log_debug("JVM library entry point found (0x%08X)", symb);
#endif
/* Prepare the VM initialization arguments */
/* Minimum Java version is Java 6 */
arg.version = JNI_VERSION_1_6;
#if defined(OSD_POSIX)
if (JNI_GetDefaultJavaVMInitArgs(&arg) < 0) {
log_error("Cannot init default JVM default args");
return false;
}
#endif
arg.ignoreUnrecognized = FALSE;
arg.nOptions = args->onum + 5; /* pid, ppid, version, class and abort */
opt = (JavaVMOption *) malloc(arg.nOptions * sizeof(JavaVMOption));
for (x = 0; x < args->onum; x++) {
opt[x].optionString = strdup(args->opts[x]);
jsvc_xlate_to_ascii(opt[x].optionString);
opt[x].extraInfo = NULL;
}
/* Add our daemon process id */
snprintf(daemonprocid, sizeof(daemonprocid), "-Dcommons.daemon.process.id=%d", (int)getpid());
opt[x].optionString = strdup(daemonprocid);
jsvc_xlate_to_ascii(opt[x].optionString);
opt[x++].extraInfo = NULL;
snprintf(daemonprocid, sizeof(daemonprocid),
"-Dcommons.daemon.process.parent=%d", (int)getppid());
opt[x].optionString = strdup(daemonprocid);
jsvc_xlate_to_ascii(opt[x].optionString);
opt[x++].extraInfo = NULL;
snprintf(daemonprocid, sizeof(daemonprocid),
"-Dcommons.daemon.version=%s", JSVC_VERSION_STRING);
opt[x].optionString = strdup(daemonprocid);
jsvc_xlate_to_ascii(opt[x].optionString);
opt[x++].extraInfo = NULL;
/* DBCP-388. For the benefit of jconsole. */
snprintf(daemonprocid, sizeof(daemonprocid), "-Dsun.java.command=%s", args->clas);
opt[x].optionString = strdup(daemonprocid);
jsvc_xlate_to_ascii(opt[x].optionString);
opt[x++].extraInfo = NULL;
opt[x].optionString = strdup("abort");
jsvc_xlate_to_ascii(opt[x].optionString);
opt[x].extraInfo = (void *)java_abort123;
arg.options = opt;
/* Do some debugging */
if (log_debug_flag == true) {
log_debug("+-- DUMPING JAVA VM CREATION ARGUMENTS -----------------");
log_debug("| Version: %#08x", arg.version);
log_debug("| Ignore Unrecognized Arguments: %s",
arg.ignoreUnrecognized == TRUE ? "True" : "False");
log_debug("| Extra options: %d", args->onum);
for (x = 0; x < args->onum; x++) {
jsvc_xlate_from_ascii(opt[x].optionString);
log_debug("| \"%s\" (0x%08x)", opt[x].optionString, opt[x].extraInfo);
jsvc_xlate_to_ascii(opt[x].optionString);
}
log_debug("+-------------------------------------------------------");
log_debug("| Internal options: %d", arg.nOptions - args->onum);
for (; x < arg.nOptions; x++) {
jsvc_xlate_from_ascii(opt[x].optionString);
log_debug("| \"%s\" (0x%08x)", opt[x].optionString, opt[x].extraInfo);
jsvc_xlate_to_ascii(opt[x].optionString);
}
log_debug("+-------------------------------------------------------");
}
/* And finally create the Java VM */
#if defined(OSD_POSIX)
ret = JNI_CreateJavaVM(&jvm, &env, &arg);
#else
ret = (*symb) (&jvm, &env, &arg);
#endif
if (ret < 0) {
log_error("Cannot create Java VM");
return false;
}
log_debug("Java VM created successfully");
jsvc_xlate_to_ascii(loaderclass);
cls = (*env)->FindClass(env, loaderclass);
jsvc_xlate_from_ascii(loaderclass);
if (cls == NULL) {
log_error("Cannot find daemon loader %s", loaderclass);
return false;
}
log_debug("Class %s found", loaderclass);
jsvc_xlate_to_ascii(shutdownmethod);
nativemethods[0].name = shutdownmethod;
jsvc_xlate_to_ascii(shutdownparams);
nativemethods[0].signature = shutdownparams;
nativemethods[0].fnPtr = (void *)shutdown;
jsvc_xlate_to_ascii(failedmethod);
nativemethods[1].name = failedmethod;
jsvc_xlate_to_ascii(failedparams);
nativemethods[1].signature = failedparams;
nativemethods[1].fnPtr = (void *)failed;
if ((*env)->RegisterNatives(env, cls, nativemethods, 2) != 0) {
log_error("Cannot register native methods");
return false;
}
log_debug("Native methods registered");
return true;
}