summaryrefslogtreecommitdiff
path: root/jvmfwk
diff options
context:
space:
mode:
authorPatrick Luby <pluby@neooffice.org>2015-10-04 18:43:11 +0200
committerNorbert Thiebaud <nthiebaud@gmail.com>2015-11-04 09:29:22 +0000
commit32bc8ddbf335dd26019edcf12758643b4cff9913 (patch)
tree89c974f0077d3277b05106e551f62b87e0bdddd2 /jvmfwk
parentd3248d1fd83cca67a11dd593c124694382bf5f34 (diff)
tdf#94716 allow Oracle's JDK to be used on OS X 10.10 and 10.11
Change-Id: Ide9b4beebb407e4ceee30f1d99f29d028c848d8c Reviewed-on: https://gerrit.libreoffice.org/19131 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Norbert Thiebaud <nthiebaud@gmail.com>
Diffstat (limited to 'jvmfwk')
-rw-r--r--jvmfwk/Library_jvmfwk.mk14
-rw-r--r--jvmfwk/plugins/sunmajor/pluginlib/sunjavaplugin.cxx13
-rw-r--r--jvmfwk/plugins/sunmajor/pluginlib/sunjre.cxx3
-rw-r--r--jvmfwk/plugins/sunmajor/pluginlib/util.cxx41
-rw-r--r--jvmfwk/plugins/sunmajor/pluginlib/util_cocoa.hxx6
-rw-r--r--jvmfwk/plugins/sunmajor/pluginlib/util_cocoa.mm129
6 files changed, 195 insertions, 11 deletions
diff --git a/jvmfwk/Library_jvmfwk.mk b/jvmfwk/Library_jvmfwk.mk
index 15f1a26fcb3a..f3373b781b20 100644
--- a/jvmfwk/Library_jvmfwk.mk
+++ b/jvmfwk/Library_jvmfwk.mk
@@ -54,6 +54,20 @@ $(eval $(call gb_Library_use_externals,jvmfwk,\
valgrind \
))
+ifeq ($(OS),MACOSX)
+$(eval $(call gb_Library_add_cxxflags,jvmfwk,\
+ $(gb_OBJCXXFLAGS) \
+))
+
+$(eval $(call gb_Library_add_objcxxobjects,jvmfwk,\
+ jvmfwk/plugins/sunmajor/pluginlib/util_cocoa \
+))
+
+$(eval $(call gb_Library_add_libs,jvmfwk,\
+ -framework Foundation \
+))
+endif
+
$(eval $(call gb_Library_add_exception_objects,jvmfwk,\
jvmfwk/plugins/sunmajor/pluginlib/gnujre \
jvmfwk/plugins/sunmajor/pluginlib/otherjre \
diff --git a/jvmfwk/plugins/sunmajor/pluginlib/sunjavaplugin.cxx b/jvmfwk/plugins/sunmajor/pluginlib/sunjavaplugin.cxx
index 43556e2c566a..6cd5c19267ec 100644
--- a/jvmfwk/plugins/sunmajor/pluginlib/sunjavaplugin.cxx
+++ b/jvmfwk/plugins/sunmajor/pluginlib/sunjavaplugin.cxx
@@ -54,6 +54,10 @@
#include "vendorlist.hxx"
#include "diagnostics.h"
+#ifdef MACOSX
+#include "util_cocoa.hxx"
+#endif
+
#ifdef ANDROID
#include <osl/detail/android-bootstrap.h>
#else
@@ -655,7 +659,16 @@ javaPluginError jfw_plugin_startJavaVirtualMachine(
//Check if the Vendor (pInfo->sVendor) is supported by this plugin
if ( ! isVendorSupported(pInfo->sVendor))
return JFW_PLUGIN_E_WRONG_VENDOR;
+#ifdef MACOSX
+ rtl::Reference<VendorBase> aVendorInfo = getJREInfoByPath( OUString( pInfo->sLocation ) );
+ if ( !aVendorInfo.is() || aVendorInfo->compareVersions( OUString( pInfo->sVersion ) ) < 0 )
+ return JFW_PLUGIN_E_VM_CREATION_FAILED;
+#endif
OUString sRuntimeLib = getRuntimeLib(pInfo->arVendorData);
+#ifdef MACOSX
+ if ( !JvmfwkUtil_isLoadableJVM( sRuntimeLib ) )
+ return JFW_PLUGIN_E_VM_CREATION_FAILED;
+#endif
JFW_TRACE2("Using Java runtime library: " << sRuntimeLib);
#ifndef ANDROID
diff --git a/jvmfwk/plugins/sunmajor/pluginlib/sunjre.cxx b/jvmfwk/plugins/sunmajor/pluginlib/sunjre.cxx
index e38ecf803569..ecd8efcc659e 100644
--- a/jvmfwk/plugins/sunmajor/pluginlib/sunjre.cxx
+++ b/jvmfwk/plugins/sunmajor/pluginlib/sunjre.cxx
@@ -62,7 +62,8 @@ char const* const* SunInfo::getRuntimePaths(int * size)
"/bin/server/jvm.dll"
#elif defined MACOSX && defined X86_64
// Oracle Java 7, under /Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home
- "/lib/server/libjvm.dylib"
+ "/lib/server/libjvm.dylib",
+ "/lib/jli/libjli.dylib"
#elif defined UNX
"/lib/" JFW_PLUGIN_ARCH "/client/libjvm.so",
"/lib/" JFW_PLUGIN_ARCH "/server/libjvm.so",
diff --git a/jvmfwk/plugins/sunmajor/pluginlib/util.cxx b/jvmfwk/plugins/sunmajor/pluginlib/util.cxx
index eb2d5130ce0c..3463e74ce58d 100644
--- a/jvmfwk/plugins/sunmajor/pluginlib/util.cxx
+++ b/jvmfwk/plugins/sunmajor/pluginlib/util.cxx
@@ -54,6 +54,9 @@
#include "sunjre.hxx"
#include "vendorlist.hxx"
#include "diagnostics.h"
+#ifdef MACOSX
+#include "util_cocoa.hxx"
+#endif
using namespace osl;
using namespace std;
@@ -435,6 +438,8 @@ bool getJavaProps(const OUString & exePath,
}
#ifdef MACOSX
+ if (!JvmfwkUtil_isLoadableJVM(exePath))
+ return false;
if (sClassPath.endsWith("/"))
sClassPath += "../Resources/java/";
else
@@ -1194,21 +1199,36 @@ void addJavaInfosDirScan(
getAndAddJREInfoByPath("file:////usr/jdk/latest", allInfos, addedInfos);
}
-#elif defined MACOSX && defined X86_64
-
-void addJavaInfosDirScan(
- std::vector<rtl::Reference<VendorBase>> & allInfos,
- std::vector<rtl::Reference<VendorBase>> & addedInfos)
-{
- // Oracle Java 7
- getAndAddJREInfoByPath("file:///Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home", allInfos, addedInfos);
-}
-
#else
void addJavaInfosDirScan(
std::vector<rtl::Reference<VendorBase>> & allInfos,
std::vector<rtl::Reference<VendorBase>> & addedInfos)
{
+#ifdef MACOSX
+ // Ignore all but Oracle's JDK as loading Apple's Java and Oracle's JRE
+ // will cause OS X's JavaVM framework to display a dialog and invoke
+ // exit() when loaded via JNI on OS X 10.10
+ Directory aDir("file:///Library/Java/JavaVirtualMachines");
+ if (aDir.open() == File::E_None)
+ {
+ DirectoryItem aItem;
+ while (aDir.getNextItem(aItem) == File::E_None)
+ {
+ FileStatus aStatus(osl_FileStatus_Mask_FileURL);
+ if (aItem.getFileStatus(aStatus) == File::E_None)
+ {
+ OUString aItemURL( aStatus.getFileURL() );
+ if (aItemURL.getLength())
+ {
+ aItemURL += "/Contents/Home";
+ if (DirectoryItem::get(aItemURL, aItem) == File::E_None)
+ getAndAddJREInfoByPath(aItemURL, allInfos, addedInfos);
+ }
+ }
+ }
+ aDir.close();
+ }
+#else // MACOSX
OUString excMessage = "[Java framework] sunjavaplugin: "
"Error in function addJavaInfosDirScan in util.cxx.";
int cJavaNames= sizeof(g_arJavaNames) / sizeof(char*);
@@ -1322,6 +1342,7 @@ void addJavaInfosDirScan(
}
}
}
+#endif // MACOSX
}
#endif // ifdef SOLARIS
#endif // ifdef UNX
diff --git a/jvmfwk/plugins/sunmajor/pluginlib/util_cocoa.hxx b/jvmfwk/plugins/sunmajor/pluginlib/util_cocoa.hxx
new file mode 100644
index 000000000000..9a7c7b92353b
--- /dev/null
+++ b/jvmfwk/plugins/sunmajor/pluginlib/util_cocoa.hxx
@@ -0,0 +1,6 @@
+#ifndef __UTIL_COCOA_H__
+#define __UTIL_COCOA_H__
+
+bool JvmfwkUtil_isLoadableJVM( OUString aURL );
+
+#endif
diff --git a/jvmfwk/plugins/sunmajor/pluginlib/util_cocoa.mm b/jvmfwk/plugins/sunmajor/pluginlib/util_cocoa.mm
new file mode 100644
index 000000000000..47bab8caf621
--- /dev/null
+++ b/jvmfwk/plugins/sunmajor/pluginlib/util_cocoa.mm
@@ -0,0 +1,129 @@
+#include <rtl/ustring.hxx>
+
+#include <premac.h>
+#import <Foundation/Foundation.h>
+#include <postmac.h>
+
+#import "util_cocoa.hxx"
+
+using namespace rtl;
+
+bool JvmfwkUtil_isLoadableJVM( OUString aURL )
+{
+ bool bRet = false;
+
+ if ( aURL.getLength() )
+ {
+ NSAutoreleasePool *pPool = [[NSAutoreleasePool alloc] init];
+
+ NSString *pString = [NSString stringWithCharacters:aURL.getStr() length:aURL.getLength()];
+ if ( pString )
+ {
+ NSURL *pURL = nil;
+
+ // Ignore all but Oracle's JDK as loading Apple's Java and Oracle's
+ // JRE will cause OS X's JavaVM framework to display a dialog and
+ // invoke exit() when loaded via JNI on OS X 10.10
+ NSURL *pTmpURL = [NSURL URLWithString:pString];
+ if ( pTmpURL )
+ pTmpURL = [pTmpURL filePathURL];
+ if ( pTmpURL )
+ pTmpURL = [pTmpURL URLByStandardizingPath];
+ if ( pTmpURL )
+ pTmpURL = [pTmpURL URLByResolvingSymlinksInPath];
+ if ( pTmpURL )
+ {
+ NSURL *pJVMsDirURL = [NSURL URLWithString:@"file:///Library/Java/JavaVirtualMachines/"];
+ if ( pJVMsDirURL )
+ pJVMsDirURL= [pJVMsDirURL filePathURL];
+ if ( pJVMsDirURL )
+ pJVMsDirURL = [pJVMsDirURL URLByStandardizingPath];
+ // The JVM directory must not contain softlinks or the JavaVM
+ // framework bug will occur so don't resolve softlinks in the
+ // JVM directory
+ if ( pJVMsDirURL )
+ {
+ NSString *pTmpURLString = [pTmpURL absoluteString];
+ NSString *pJVMsDirURLString = [pJVMsDirURL absoluteString];
+ if ( pTmpURLString && pJVMsDirURLString && [pJVMsDirURLString length] )
+ {
+ NSRange aJVMsDirURLRange = [pTmpURLString rangeOfString:pJVMsDirURLString];
+ if ( !aJVMsDirURLRange.location && aJVMsDirURLRange.length )
+ pURL = pTmpURL;
+ }
+ }
+ }
+
+ while ( pURL )
+ {
+ // Check if this is a valid bundle
+ NSNumber *pDir = nil;
+ NSURL *pContentsURL = [pURL URLByAppendingPathComponent:@"Contents"];
+ if ( pContentsURL && [pContentsURL getResourceValue:&pDir forKey:NSURLIsDirectoryKey error:nil] && pDir && [pDir boolValue] )
+ {
+ NSBundle *pBundle = [NSBundle bundleWithURL:pURL];
+ if ( pBundle )
+ {
+ // Make sure that this bundle's Info.plist has the
+ // proper JVM keys to supports loading via JNI. If
+ // this bundle is a valid JVM and these keys
+ // are missing, loading the JVM will cause OS X's
+ // JavaVM framework to display a dialog and invoke
+ // exit() when loaded via JNI on OS X 10.10.
+ NSDictionary *pInfo = [pBundle infoDictionary];
+ if ( pInfo )
+ {
+ NSDictionary *pJavaVM = [pInfo objectForKey:@"JavaVM"];
+ if ( pJavaVM && [pJavaVM isKindOfClass:[NSDictionary class]] )
+ {
+ NSArray *pJVMCapabilities = [pJavaVM objectForKey:@"JVMCapabilities"];
+ if ( pJVMCapabilities )
+ {
+ if ( [pJVMCapabilities indexOfObjectIdenticalTo:@"JNI"] == NSNotFound )
+ {
+ if ( [pJVMCapabilities isKindOfClass:[NSMutableArray class]] )
+ {
+ [(NSMutableArray *)pJVMCapabilities addObject:@"JNI"];
+ bRet = true;
+ }
+ else if ( [pJavaVM isKindOfClass:[NSMutableDictionary class]] )
+ {
+ NSMutableArray *pNewJVMCapabilities = [NSMutableArray arrayWithCapacity:[pJVMCapabilities count] + 1];
+ if ( pNewJVMCapabilities )
+ {
+ [pNewJVMCapabilities addObject:@"JNI"];
+ [(NSMutableDictionary *)pJavaVM setObject:pNewJVMCapabilities forKey:@"JVMCapabilities"];
+ bRet = true;
+ }
+ }
+ }
+ else
+ {
+ bRet = true;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ NSURL *pOldURL = pURL;
+ pURL = [pURL URLByDeletingLastPathComponent];
+ if ( pURL )
+ {
+ pURL = [pURL URLByStandardizingPath];
+ if ( pURL )
+ {
+ pURL = [pURL URLByResolvingSymlinksInPath];
+ if ( pURL && [pURL isEqual:pOldURL] )
+ pURL = nil;
+ }
+ }
+ }
+ }
+
+ [pPool release];
+ }
+
+ return bRet;
+}