< prev index next >
src/java.base/macosx/native/libjli/java_md_macosx.c
Print this page
rev 12879 : 8136556: Add the ability to perform static builds of MacOSX x64 binaries
Reviewed-by: ihse, bdelsart, gadams, lfoltan, rriggs, hseigel, twisti
@@ -243,10 +243,12 @@
}
return sExportedJNIFunctions = fxns;
}
+#ifndef STATIC_BUILD
+
JNIEXPORT jint JNICALL
JNI_GetDefaultJavaVMInitArgs(void *args) {
InvocationFunctions *ifn = GetExportedJNIFunctions();
if (ifn == NULL) return JNI_ERR;
return ifn->GetDefaultJavaVMInitArgs(args);
@@ -263,10 +265,11 @@
JNI_GetCreatedJavaVMs(JavaVM **vmBuf, jsize bufLen, jsize *nVMs) {
InvocationFunctions *ifn = GetExportedJNIFunctions();
if (ifn == NULL) return JNI_ERR;
return ifn->GetCreatedJavaVMs(vmBuf, bufLen, nVMs);
}
+#endif
/*
* Allow JLI-aware launchers to specify a client/server preference
*/
JNIEXPORT void JNICALL
@@ -301,11 +304,16 @@
static void *apple_main (void *arg)
{
objc_registerThreadWithCollector();
if (main_fptr == NULL) {
+#ifdef STATIC_BUILD
+ extern int main(int argc, char **argv);
+ main_fptr = &main;
+#else
main_fptr = (int (*)())dlsym(RTLD_DEFAULT, "main");
+#endif
if (main_fptr == NULL) {
JLI_ReportErrorMessageSys("error locating main entrypoint\n");
exit(1);
}
}
@@ -586,17 +594,21 @@
JLI_Snprintf(jvmpath, jvmpathsize, "%s/lib/%s/" JVM_DLL, jrepath, jvmtypeUsed);
}
JLI_TraceLauncher("Does `%s' exist ... ", jvmpath);
+#ifdef STATIC_BUILD
+ return JNI_TRUE;
+#else
if (stat(jvmpath, &s) == 0) {
JLI_TraceLauncher("yes.\n");
return JNI_TRUE;
} else {
JLI_TraceLauncher("no.\n");
return JNI_FALSE;
}
+#endif
}
/*
* Find path to JRE based on .exe's location or registry settings.
*/
@@ -605,14 +617,22 @@
{
char libjava[MAXPATHLEN];
if (GetApplicationHome(path, pathsize)) {
/* Is JRE co-located with the application? */
+#ifdef STATIC_BUILD
+ char jvm_cfg[MAXPATHLEN];
+ JLI_Snprintf(jvm_cfg, sizeof(jvm_cfg), "%s/lib/jvm.cfg", path);
+ if (access(jvm_cfg, F_OK) == 0) {
+ return JNI_TRUE;
+ }
+#else
JLI_Snprintf(libjava, sizeof(libjava), "%s/lib/" JAVA_DLL, path);
if (access(libjava, F_OK) == 0) {
return JNI_TRUE;
}
+#endif
/* ensure storage for path + /jre + NULL */
if ((JLI_StrLen(path) + 4 + 1) > (size_t) pathsize) {
JLI_TraceLauncher("Insufficient space to store JRE path\n");
return JNI_FALSE;
}
@@ -627,10 +647,28 @@
/* try to find ourselves instead */
Dl_info selfInfo;
dladdr(&GetJREPath, &selfInfo);
+#ifdef STATIC_BUILD
+ char jvm_cfg[MAXPATHLEN];
+ char *p = NULL;
+ strncpy(jvm_cfg, selfInfo.dli_fname, MAXPATHLEN);
+ p = strrchr(jvm_cfg, '/'); *p = '\0';
+ p = strrchr(jvm_cfg, '/');
+ if (strcmp(p, "/.") == 0) {
+ *p = '\0';
+ p = strrchr(jvm_cfg, '/'); *p = '\0';
+ }
+ else *p = '\0';
+ strncpy(path, jvm_cfg, pathsize);
+ strncat(jvm_cfg, "/lib/jvm.cfg", MAXPATHLEN);
+ if (access(jvm_cfg, F_OK) == 0) {
+ return JNI_TRUE;
+ }
+#endif
+
char *realPathToSelf = realpath(selfInfo.dli_fname, path);
if (realPathToSelf != path) {
return JNI_FALSE;
}
@@ -662,11 +700,15 @@
Dl_info dlinfo;
void *libjvm;
JLI_TraceLauncher("JVM path is %s\n", jvmpath);
+#ifndef STATIC_BUILD
libjvm = dlopen(jvmpath, RTLD_NOW + RTLD_GLOBAL);
+#else
+ libjvm = dlopen(NULL, RTLD_FIRST);
+#endif
if (libjvm == NULL) {
JLI_ReportErrorMessage(DLL_ERROR1, __LINE__);
JLI_ReportErrorMessage(DLL_ERROR2, jvmpath, dlerror());
return JNI_FALSE;
}
@@ -712,13 +754,18 @@
SetExecname(char **argv)
{
char* exec_path = NULL;
{
Dl_info dlinfo;
- int (*fptr)();
+#ifdef STATIC_BUILD
+ void *fptr;
+ fptr = (void *)&SetExecname;
+#else
+ int (*fptr)();
fptr = (int (*)())dlsym(RTLD_DEFAULT, "main");
+#endif
if (fptr == NULL) {
JLI_ReportErrorMessage(DLL_ERROR3, dlerror());
return JNI_FALSE;
}
< prev index next >