java - Android NoSuchMethodError : No virtual method invoke in MethodHandle,

标签 java android methodhandle

我正在尝试在 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 参数,但在运行时它会尝试查找参数类型为 Objectint 且参数数量为 2 的方法。

我尝试用数组参数替换 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 升级到这个版本)。

关于java - Android NoSuchMethodError : No virtual method invoke in MethodHandle,,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46935747/

相关文章:

java - Android 应用强制关闭的主要原因

android - 当一个 Activity 在它的结果 Activity 之前关闭时会发生什么?

android - MediaPlayer,只有视频 m3u8 HTML 流工作

java-7 - Java-7 中的签名多态方法

java - GIF 基于每台计算机的速度?

java - 如何获取cpu、gpu和os全名

java - 使用 Gson 反序列化 JSON

android - 如何显示来自 api 的 <img src> html 标签的图像?

java - 我想打印 hi GrandFather;但它似乎打印 hi Father

java - LambdaMetaFactory 装箱/拆箱参数和返回类型