Skip to content

Java 6 compatibility#876

Merged
matthiasblaesing merged 2 commits intojava-native-access:masterfrom
matthiasblaesing:java6
Nov 22, 2017
Merged

Java 6 compatibility#876
matthiasblaesing merged 2 commits intojava-native-access:masterfrom
matthiasblaesing:java6

Conversation

@matthiasblaesing
Copy link
Copy Markdown
Member

This is a partial fix to restore Java 6 compatibility:

  • unittests for jna can be compiled with a Java 6 JDK
  • the jna-platform can be compiled with a Java 6 JDK
  • the unittests for the jna-plaform still require a Java 7 JDK

@matthiasblaesing
Copy link
Copy Markdown
Member Author

@lwahonen Will could you have a look at this changeset? I had a look at the "Java 6 compatibility" problem, and this would be my suggestion for a fix. The usage of reflection will creation of the exception down, but considering this is the already slow exception path I consider this acceptable. In turn this keeps the functionality for newer JDKs in place.

What do you think? If you agree, I'll backport this to the 4.5.1-dev branch and will do a release for that.

@lwahonen
Copy link
Copy Markdown

lwahonen commented Nov 19, 2017

Should we log the suppressed error here?

        if(addSuppressedMethod == null) {
-            // Make this a NOOP on an unsupported JDK
+            Logger.getLogger(Win32Exception.class.getName()).log(Level.SEVERE, "Suppressed exception will not be visible on JVM 6", exception);
            return;
        }

Other than that, I think your solution is much better than my quick-and-dirty hack was. Thank you!

@matthiasblaesing
Copy link
Copy Markdown
Member Author

I would not change that. addSuppressedMethod can only be null if either the method is not present or not reflectively callable. If the latter is the case a log message is created on severity SEVERE. On a recent JVM i see this only happening for VMs not supporting reflection (I'm willing to risk that).

This leaves the first case: If the method is not present, its companion getSuppressed must also be present to be usable. If a library/application depends on the knowledge about the suppressed exceptions, it needs to call getSuppressed, so this prevents the library to work on Java prior to 7 and so addSuppressed is either present or without any use.

addSuppressed was added to Throwable in JDK7, to be compatible with
Java 6 it can't be called directly. To replace the functionality
reflection is used. A helper method "addSuppressedRelfected" was
introduced into the only class, that currently uses suppressed 
exceptions (Win32Exception).
@matthiasblaesing matthiasblaesing merged commit 028fff0 into java-native-access:master Nov 22, 2017
@matthiasblaesing matthiasblaesing deleted the java6 branch December 3, 2017 19:55
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants