前面的文章 方舟可执行文件简介和 对java2jar及方舟工具链的进一步分析 对工具链中的可执行文件以及测试用例的编译都进行了分析,并对java2jar进行了修改,保证了其可运行。但是后续的jbc2mpl、maple、mplcg都还不能正常的运行,个人猜测是在jbc2mpl少了一个库,一个jar格式或者是mplt格式的库,这个库应该就是java2jar也要用的java-core.jar库(虽然其实我个人认为java2jar其实完全没必要用这个库)。
分析到了这一步,这个运行时库就成为了继续分析工具链和测试用例编译的关键问题了,我感觉这个运行时库应该也不会有什么太特殊的地方,毕竟编译出来的应用之后还要对接Android的,太特殊的话后续就无法正常对接了。(当然,具体怎么样,还得等这部分开源之后看代码了。)
网络上也有一些大佬去在尝试各种下载的java-core,我在网络上找了一大堆的疑似java-core库或者是部分同名库、同名库进行测试。总共测试了有十几个库之后(选了几个典型的代表放在后面了),终于有一个java-core库能让我编译测试用例通过了。只不过最终的编译出来的文件的运行,还有待验证,但是至少编译过程没问题了。
我找到的可用的java-core的可用的库地址为:码云极速下载/java-core
下面详细介绍我的编译和验证过程(前提是已经编译方舟成功了,已经生成了四个工具链的可执行文件):
1、根据java2jar.mk中的对java-core.jar的引用,这个java-core.jar应该是在OpenArkCompiler/libjava-core/目录之下。所以在源码主目录下新建libjava-core目录,将所下载的java-core.jar包放进去。
2、jbc2mpl执行的过程中依赖一个mplt格式的LIB_MPLT,我推测这个库就是1中的java-core.jar的mplt格式,毕竟我们要生成一个中间格式的程序,为其添加运行时库的mplt格式才会能正常使用。不管如何,目前已有的信息,也只能在这个基础上验证了。使用"jbc2mpl -injar java-core.jar -out libjava-core"命令,然后可以得到一个名为libjava-core.mpl和libjava-core.mplt的输出。这个过程因为各个jar包都不小,所以有的jar包执行时间比较长。
3、这时候,按照sample的Makefile体系,其中所缺的java-core.jar和libjava-core.mplt已经都有了,那么可以直接在samples/helloworld目录之下执行“make”命令。这时候可以看到整个helloworld的编译过程:
这个编译过程,其实就是我们前文提到过的build/core/下的makefile的编译过程:
所有的执行过程和配置参数,都是在这几个文件里面写的。也可以通过修改这三个文件,来优化和调整测试用例的编译过程。而最后samples/helloworld目录所生成的文件如下所示:
至此,算是能让工具链的四个可执行文件都跑了起来,而且编译了一个测试用例。但是,编译出来的结果是否正确,各个都代表着什么含义,还需要进一步的学习和分析。所有的试过的jar都是按照上述流程来做的,多数的jar包在第二步的时候就出现了错误。
此外,利用这一个可用的jar包,我对编译系统进行了优化,可以实现java2jar不依赖java-core.jar;jbc2mpl也不依赖libjava-core.mplt,只依赖java-core.jar;就可以编译测试用例。这是对我小乖他爹:方舟编译器学习笔记7 对java2jar及方舟工具链的进一步分析 中想法的进一步验证,会在后续专门再写一篇笔记。
——————————分割线——————————
按照前文的步骤,前后一共测试了接近二十个各种各样的jar包,除了上面的可用那个,其他都有问题。在这里就不一一详述了,简单列几个具有代表性的:
参考文献:
说明:这位大神和我的想法不谋而合,也坚定了我按照这个方法不断测试jar包的想法。在此专门表示感谢。