diff --git a/CHANGES.md b/CHANGES.md
index fdc77f006..634aba51b 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -2,15 +2,12 @@ NOTE: as of JNA 4.0, JNA is now dual-licensed under LGPL and AL 2.0 (see LICENSE
NOTE: JNI native support is typically incompatible between minor versions, and almost always incompatible between major versions.
-Next Release (5.20.0)
+Next Release (5.19.1)
=====================
-Features
---------
-
Bug Fixes
---------
-
+* [#1730](https://github.com/java-native-access/jna/issues/1730): Replace usage of `MethodHandle` with reflection to restore support for older Android releases - [@matthiasblaesing](https://github.com/matthiasblaesing).
Release 5.19.0
==============
diff --git a/common.xml b/common.xml
index 5f5158ea4..304164f75 100644
--- a/common.xml
+++ b/common.xml
@@ -8,8 +8,8 @@
-
-
+
+
diff --git a/src/com/sun/jna/Native.java b/src/com/sun/jna/Native.java
index ed351bf8b..e7c401e50 100644
--- a/src/com/sun/jna/Native.java
+++ b/src/com/sun/jna/Native.java
@@ -35,13 +35,10 @@
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
-import java.lang.invoke.MethodHandle;
-import java.lang.invoke.MethodHandles;
-import java.lang.invoke.MethodHandles.Lookup;
-import java.lang.invoke.MethodType;
import java.lang.ref.Reference;
import java.lang.ref.WeakReference;
import java.lang.reflect.Array;
+import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
@@ -184,15 +181,15 @@ public void uncaughtException(Callback c, Throwable e) {
private static final int TYPE_BOOL = 4;
private static final int TYPE_LONG_DOUBLE = 5;
- private static final MethodHandle stackWalkerGetInstance;
+ private static final Method stackWalkerGetInstance;
private static final Enum stackWalkerRetainClassReference;
- private static final MethodHandle stackWalkerWalk;
+ private static final Method stackWalkerWalk;
private static final Object stackWalkerFilter;
- private static final MethodHandle securityManagerExposerConstructor;
- private static final MethodHandle securityManagerGetClassContext;
+ private static final Constructor securityManagerExposerConstructor;
+ private static final Method securityManagerGetClassContext;
- private static final MethodHandle accessControllerDoPrivileged;
+ private static final Method accessControllerDoPrivileged;
static final int MAX_ALIGNMENT;
static final int MAX_PADDING;
@@ -270,18 +267,17 @@ static boolean isCompatibleVersion(String expectedVersion, String nativeVersion)
MAX_PADDING = (Platform.isMac() && Platform.isPPC()) ? 8 : MAX_ALIGNMENT;
Enum stackWalkerRetainClassReferenceBuilder;
- MethodHandle stackWalkerGetInstanceBuilder;
- MethodHandle stackWalkerWalkBuilder;
+ Method stackWalkerGetInstanceBuilder;
+ Method stackWalkerWalkBuilder;
Object stackWalkerFilterBuilder;
try {
- Lookup lookup = MethodHandles.lookup();
Class> stackWalkerClass = Class.forName("java.lang.StackWalker");
Class extends Enum> stackWalkerOptionClass = (Class extends Enum>) Class.forName("java.lang.StackWalker$Option");
stackWalkerRetainClassReferenceBuilder = Enum.valueOf(stackWalkerOptionClass, "RETAIN_CLASS_REFERENCE");
- stackWalkerGetInstanceBuilder = lookup.findStatic(stackWalkerClass, "getInstance", MethodType.methodType(stackWalkerClass, stackWalkerOptionClass));
- stackWalkerWalkBuilder = lookup.findVirtual(stackWalkerClass, "walk", MethodType.methodType(Object.class, java.util.function.Function.class));
+ stackWalkerGetInstanceBuilder = stackWalkerClass.getMethod("getInstance", stackWalkerOptionClass);
+ stackWalkerWalkBuilder = stackWalkerClass.getMethod("walk", java.util.function.Function.class);
Class> stackframe = Class.forName("java.lang.StackWalker$StackFrame");
- MethodHandle stackFrameGetDeclaringClass = lookup.findVirtual(stackframe, "getDeclaringClass", MethodType.methodType(Class.class));
+ Method stackFrameGetDeclaringClass = stackframe.getMethod("getDeclaringClass");
stackWalkerFilterBuilder = new java.util.function.Function, Class>>() {
@Override
public Class> apply(Stream