【问题标题】:`java.lang.NoClassDefFoundError: android/view/View` while trying to build 'HelloWorld' project from android-kawa in Termux`java.lang.NoClassDefFoundError: android/view/View` 尝试在 Termux 中从 android-kawa 构建“HelloWorld”项目
【发布时间】:2021-09-25 22:16:52
【问题描述】:

我一直在尝试使用Kawa Scheme 来开发 Android 项目。我在 GitHub 上找到了两个存储库:一个名为“android-kawa”,另一个名为“KawaDroid”。它们都有点过时(最近一次更新是在 2012 年左右)。在“android-kawa”的情况下,我能够联系到作者,但他说他没有记住足够的帮助我。

在 'android-kawa' 存储库中,有一堆用于设置和使用项目的脚本。其中一个脚本会下载 Kawa 1.13 tarball,应用一些补丁,然后尝试构建它。

但是,Termux 不支持构建,因为config.guess 脚本无法识别系统。通过下载最新版本的config.guess and config.sub,可以轻松解决此问题。

另一个问题是 JVM 字节码的格式。当我使用最新的 Java 编译器时,生成的字节码包含(我相信)JVM8+ 的指令,dx 命令不支持这些指令。如果我在 Termux 中运行 Java,这不是问题,因为它会安装常规 JVM,但如果我想在我的 APK 中包含 Kawa jar(这是我想要的),那么它就会成为一个障碍。

这同样可以通过在javac 中强制 Java 版本为 7 来解决。 (但是,编译器认为 Java 1.7 已被弃用。我想这就是为什么 buildAPKs 项目使用 ecj 而不是 javac

另外,当我./configure Kawa 时,我可以将路径传递给android.jar 文件(./configure --with-android=...)。我的系统上有两个android.jar 文件:

~ $ locate android.jar
/data/data/com.termux/files/usr/share/aapt/android.jar
/data/data/com.termux/files/usr/share/java/android.jar

我不知道它们来自哪里,也不知道它们之间有何不同,但我一直更喜欢第二个。

所以,当我有可用的 kawa.jar 时 - 当我尝试使用命令编译它时

~/android-kawa $ java -cp $(dirname $(locate android.jar |tail -n 1)) -jar kawa/kawa-1.13.jar -C  KawaHello/src/kawa/android/hello.scm

我收到以下错误:

internal error while compiling KawaHello/src/kawa/android/hello.scm
java.lang.NoClassDefFoundError: android/view/View
        at gnu.kawa.android.defs.<clinit>(defs.scm)
        at java.base/jdk.internal.misc.Unsafe.ensureClassInitialized0(Native Method)
        at java.base/jdk.internal.misc.Unsafe.ensureClassInitialized(Unsafe.java:1155)
        at java.base/jdk.internal.reflect.UnsafeFieldAccessorFactory.newFieldAccessor(UnsafeFieldAccessorFactory.java:42)
        at java.base/jdk.internal.reflect.ReflectionFactory.newFieldAccessor(ReflectionFactory.java:185)
        at java.base/java.lang.reflect.Field.acquireFieldAccessor(Field.java:1132)
        at java.base/java.lang.reflect.Field.getFieldAccessor(Field.java:1113)
        at java.base/java.lang.reflect.Field.get(Field.java:425)
        at gnu.expr.ModuleInfo.setupModuleExp(ModuleInfo.java:195)
        at kawa.standard.require.importDefinitions(require.java:308)
        at kawa.standard.require.scanForDefinitions(require.java:219)
        at kawa.lang.Syntax.scanForm(Syntax.java:65)
        at kawa.lang.Translator.scanForm(Translator.java:1120)
        at gnu.kawa.lispexpr.LispLanguage.parse(LispLanguage.java:64)
        at gnu.expr.Compilation.process(Compilation.java:1908)
        at gnu.expr.ModuleInfo.loadByStages(ModuleInfo.java:305)
        at gnu.expr.ModuleInfo.loadByStages(ModuleInfo.java:290)
        at gnu.expr.ModuleInfo.loadByStages(ModuleInfo.java:290)
        at gnu.expr.ModuleInfo.loadByStages(ModuleInfo.java:290)
        at gnu.expr.ModuleInfo.loadByStages(ModuleInfo.java:290)
        at gnu.expr.ModuleInfo.loadByStages(ModuleInfo.java:290)
        at kawa.repl.compileFiles(repl.java:823)
        at kawa.repl.processArgs(repl.java:444)
        at kawa.repl.main(repl.java:869)
Caused by: java.lang.ClassNotFoundException: android.view.View
        at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)                                                            at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
        at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520)         ... 24 more

我显然在没有-cp 参数的情况下尝试过(效果相同)。 android/view/View.class 条目存在于jar -tf android.jar 返回的列表中。

如何进一步调查问题的根本原因,最重要的是如何解决?

【问题讨论】:

    标签: android jvm dalvik termux kawa


    【解决方案1】:

    原来我错误地调用了 Java,并且它没有看到 android.jar 文件。它有助于通过以下方式调用编译器:

    ~/android-kawa $ java -cp $(locate android.jar |tail -n 1):kawa/kawa-1.13.jar kawa.repl -C KawaHello/src/kawa/android/hello.scm
    

    (区别在于我只有一个-cp 参数,jar 文件由: 分隔,并且我明确给出了kawa.repl 类名)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-09
      • 1970-01-01
      • 1970-01-01
      • 2015-10-30
      • 2017-06-23
      • 1970-01-01
      • 2018-12-20
      • 2023-03-27
      相关资源
      最近更新 更多