我一直在尝试使用Kawa Scheme来开发Android项目。我在GitHub上找到了两个仓库:一个叫“android-kawa”,另一个叫“KawaDroid”。它们都有点过时了(最后一次更新是在2012年左右)。在“android-kawa”的情况下,我能够联系到作者,但他说他不记得足够的帮助我。
在'android-kawa' repo中有一堆用于设置和使用项目的脚本。其中一个脚本下载了Kawa 1.13 tarball,应用了一些补丁,然后尝试构建它。
但是,Termux不支持该版本,因为config.guess
脚本无法识别系统。此问题可以通过下载最新版本的config.guess
and config.sub
轻松解决。
另一个问题是JVM字节码的格式,当我使用最新的Java编译器时,生成的字节码包含(我相信)JVM 8+指令,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
返回的列表中。
我如何才能进一步调查问题的根源,最重要的是,我如何才能解决它?
1条答案
按热度按时间3vpjnl9f1#
结果是我错误地调用了Java,它没有看到
android.jar
文件。它以下面的方式帮助调用编译器:(the不同之处在于,我只有一个
-cp
参数,其中jar
文件由:
分隔,并且我显式地给予了kawa.repl
类名)