NoSuchMethodError: No virtual method invoke in MethodHandle, Android
NoSuchMethodError: No virtual method invoke in MethodHandle, Android
我正在尝试将 Android 上的 MethodHandle
用于一个项目。目前,我正在转换一些现有的 Java 代码以与 Android 兼容,但我 运行 遇到了问题。
在普通 Java 7/8 中,以下编译并打印 "Jim":
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
public class Example {
public static void main(String[] args) throws Throwable {
MethodHandle arrayReader = MethodHandles.arrayElementGetter(String[].class);
Object array = new String[]{"Hi", "there", "Jim"};
Object item = arrayReader.invoke(array, 2);
System.out.println(item);
}
}
相同的代码为 Android 编译,但在 运行 时抛出异常:
java.lang.NoSuchMethodError: No virtual method invoke(Ljava/lang/Object;I)Ljava/lang/Object; in class Ljava/lang/invoke/MethodHandle; or its super classes (declaration of 'java.lang.invoke.MethodHandle' appears in /system/framework/core-oj.jar)
MethodHandle.invoke 存在并使用 varargs 功能传递任意数量的 Object
个参数,但在 运行 时它试图找到一个参数类型为 Object
和 int
.
我尝试用数组参数替换 invoke
调用:arrayReader.invoke(new Object[]{array, 2})
,但这只会产生另一个问题:
java.lang.UnsupportedOperationException: MethodHandle.invoke cannot be invoked reflectively.
无论如何我都不希望它起作用,因为 MethodHandles.arrayElementGetter
调用产生的 MethodHandle
有两个参数(数组和索引),但我认为它值得射击.
我正在 运行使用 API 级别 26 的 Android 模拟器。这是 build.gradle
文件的一部分:
android {
compileSdkVersion 26
buildToolsVersion "26.0.1"
defaultConfig {
minSdkVersion 26
targetSdkVersion 26
versionCode 1
versionName "1.0"
...
有什么方法可以解决这个问题,或者有其他方法可以达到同样的效果吗?
我解决了自己的问题:
我将 Android studio 升级到版本 3,并升级了所有必需的插件版本,例如构建工具 Gradle 到版本 4,这解决了问题。阅读这篇文章促使我升级:pnfsoftware.com/blog/…(虽然没有特别提到将Android studio升级到这个版本)。
我正在尝试将 Android 上的 MethodHandle
用于一个项目。目前,我正在转换一些现有的 Java 代码以与 Android 兼容,但我 运行 遇到了问题。
在普通 Java 7/8 中,以下编译并打印 "Jim":
import java.lang.invoke.MethodHandle;
import java.lang.invoke.MethodHandles;
public class Example {
public static void main(String[] args) throws Throwable {
MethodHandle arrayReader = MethodHandles.arrayElementGetter(String[].class);
Object array = new String[]{"Hi", "there", "Jim"};
Object item = arrayReader.invoke(array, 2);
System.out.println(item);
}
}
相同的代码为 Android 编译,但在 运行 时抛出异常:
java.lang.NoSuchMethodError: No virtual method invoke(Ljava/lang/Object;I)Ljava/lang/Object; in class Ljava/lang/invoke/MethodHandle; or its super classes (declaration of 'java.lang.invoke.MethodHandle' appears in /system/framework/core-oj.jar)
MethodHandle.invoke 存在并使用 varargs 功能传递任意数量的 Object
个参数,但在 运行 时它试图找到一个参数类型为 Object
和 int
.
我尝试用数组参数替换 invoke
调用:arrayReader.invoke(new Object[]{array, 2})
,但这只会产生另一个问题:
java.lang.UnsupportedOperationException: MethodHandle.invoke cannot be invoked reflectively.
无论如何我都不希望它起作用,因为 MethodHandles.arrayElementGetter
调用产生的 MethodHandle
有两个参数(数组和索引),但我认为它值得射击.
我正在 运行使用 API 级别 26 的 Android 模拟器。这是 build.gradle
文件的一部分:
android {
compileSdkVersion 26
buildToolsVersion "26.0.1"
defaultConfig {
minSdkVersion 26
targetSdkVersion 26
versionCode 1
versionName "1.0"
...
有什么方法可以解决这个问题,或者有其他方法可以达到同样的效果吗?
我解决了自己的问题:
我将 Android studio 升级到版本 3,并升级了所有必需的插件版本,例如构建工具 Gradle 到版本 4,这解决了问题。阅读这篇文章促使我升级:pnfsoftware.com/blog/…(虽然没有特别提到将Android studio升级到这个版本)。