`java.lang.NoClassDefFoundError: android/view/View` while trying to build 'HelloWorld' project from android-kawa in Termux
`java.lang.NoClassDefFoundError: android/view/View` while trying to build 'HelloWorld' project from android-kawa in Termux
我一直在尝试雇用 Kawa Scheme for developing Android project. I've found two repositories on GitHub: one called 'android-kawa', and another called '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
返回的列表中。
我该如何进一步调查问题的根本原因,最重要的是,我该如何解决?
原来是我错误地调用了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
class姓名)
我一直在尝试雇用 Kawa Scheme for developing Android project. I've found two repositories on GitHub: one called 'android-kawa', and another called '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
返回的列表中。
我该如何进一步调查问题的根本原因,最重要的是,我该如何解决?
原来是我错误地调用了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
class姓名)