当前位置:   article > 正文

AidLearning安装Oracle JDK让Java Swing程序在华为MatePadPro平板上跑起来_在安卓平板上运行jar包

在安卓平板上运行jar包

AidLearning安装Oracle JDK让Java Swing程序在华为MatePadPro平板上跑起来

cemike@126.com

入手华为MatePadPro平板以后就有把windows台式机上的swing程序移植到平板上运行的想法(全部改写为android程序也不是不可以,但是势必工作量巨大,想着都累)。自封的程序猿向来宁可用六小时编程解决本来手动运算一分钟可以搞定的问题,这次也不例外。关键是只要一个Java版的HelloWorld跑成功后面所有Swing程序都可以毫不费劲地移植的愿景太具有诱惑力了:以后就可以摆脱台式机,甚至都不用背笔记本,直接带上轻薄的平板,多优雅!

开始的思路是找安卓上的windows模拟环境。就像linux上有了cygwin,windows上可以运行linux一样;Windows 也可以运行Android 模拟器。那么一定可以反其道而行之,网上还真有exagear、BOCHS等这样可以在安卓上跑windows的模拟环境,但是据说性能不佳,最后望而却步。

接触到才不到10M的AidLearning就把整个Debian系统搬到了安卓上,虽然有网友表示在小米等手机上体验很差,但在华为MatePadPro平板上还不错,感觉像发现了星辰大海。AidLearning本意是主打Python做人工智能(AI),我眼里它却是一个以前遥不可及而现在触手可及的Linux(Debian)上的Java梦!

接下来就着手在这个AidLearning里的Debian系统里折腾JDK。AidLearning的Service里可以很方便地安装OpenJDK11,成功实战了HelloWorld.java之后喜不自胜,但一进入Swing(至少AWT或Applet)就是地狱。首先默认桌面上的终端里是不会出现图形GUI的。后来发现XFCE里面的终端里运行会出现图形GUI的窗口,但问题是只有窗口,窗口里的组件一片空白。在百度上反复搜索确认不是自己的代码有问题及在台式机windows里用同样的代码验证之后,逐渐将问题锁定在OpenJDK11上,网上看了N篇文章,最后确认,Java应用程序Swing GUI空白问题在我的Debian上不是个例,在Ubuntu 8.04(https://www.linuxidc.com/linux/2008-07/14385.htm),ArchLinux build 7.u13_2.3.7-2-x86_64(https://bbs.archlinux.org/viewtopic.php?id=159016),甚至苹果机(https://bugs.java.com/bugdatabase/view_bug.do?bug_id=6311320)上都存在,每个帖子都各出奇招(在~/.bashrc中加上一行:export AWT_TOOLKIT=MToolkit;或_JAVA_AWT_WM_NONREPARENTING=1)解决了他们的问题,然而却没有解决我的问题!最后一篇帖子里明确说了这个bug从JDK 11.0.6开始(我的Debian系统openjdk版本正是11.0.6),而且这个问题要到JDK14官方才给解决。等不了!

root@localhost:~# java -version
openjdk version “11.0.6” 2020-01-14OpenJDK Runtime Environment (build 11.0.6+10-post-Debian-1deb10u1)OpenJDK 64-Bit Server VM (build 11.0.6+10-post-Debian-1deb10u1, mixed mode)

这个版本有bug只能倒退到之前的版本,就是说要卸载和重新安装。做出这个决定积攒了很久的勇气,因为在我这个Linux小白的潜意识里就知道这是要对系统动大手术。牵一发而动全身,别新的不成功还把旧的OpenJDK给搞坏了。

但最后还是走上了这条不归路。既然要动手术,不如干脆卸载OpenJDK11换Oracle JDK 8,毕竟官方的Java比开源的全面。

下面把跳过的坑梳理一下注意事项:

1.因为是华为平板,必须下载aarch64架构的安装包。之前安装了linux32位的及linux64位的jdk,死活提示“java不是文件或目录”。开始时以为环境变量或者软链接没设置对。直到看到一篇提到将32位jdk换成64位的jdk成功的文章才豁然开朗,意识到自己的华为平板是arm64架构的,必须下载aarch64架构的jdk。windows上习惯了32位的及64位的区别,安装不对程序跑不起来也会提示32位或64位,没意识到安卓还有arm架构。而且linux系统程序跑不起来也不会提示架构错误,直接提示“java不是文件或目录”真是误导人啊。自己到安装目录反复查看确认的确存在bin/java文件,困惑不解。一度走了老长的弯路,以为是环境变量或者软链接没设置对。
jdk-8u271-linux-aarch64.tar.gz下载:https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html

2.Linux上卸载和安装jdk的方法有N种,不像windows只有exe安装包和绿色免安装两种!apt-get, rpm, yum甚至纯手动安装。用apt-get卸载jdk,又有apt-get remove 与 apt-get purge两种选择,每一次做选择都很痛苦。rpm, yum在这个Debian系统里都没有。安装jdk选择了下载.tar.gz文件,用tar命令解压的方式。将台式机上下载的.tar.gz文件弄进平板的模拟Debian系统也是个问题,幸好AidLearning支持云桌面(手机桌面和电脑桌面相同),可以在电脑端在浏览器输入网址直接访问,和平板上显示的桌面完全相同(网页里点击XFCE支持图形化桌面,很神奇),而且键盘鼠标无缝衔接。里面的Finder又有上传(向上箭头按钮)功能。

3.装完之后还得配置环境变量。/etc/profile、/root/.bashrc、/root/.bash_profile和/root/.profile四者之间很混淆啊。后来知道/etc/profile的设置会覆盖后两者,而在Debian里只有/root/.profile没有/root/.bash_profile。弄清每一个真相都耗了不少时间。

4.最后还有建立更新软链接。以为配置环境变量就能开心玩耍?图样图森破!依然死活提示“bash: java未知命令”或“java不是文件或目录”。明明java就在那里,怎么会没有呢?后来明白了:如果文件本身存在如/usr/lib/jvm/jdk1.8.0_271/bin/java且没架构(linux32位/linux64位/arm64位)等问题,那么在/usr/lib/jvm/jdk1.8.0_271/bin目录里是能够通过./java执行的(哪怕报错)。如果一直报错“java不是文件或目录”,那是这个文件本身有问题,就像不存在一样。windows报错弹窗消息太多让人诟病,Linux出错了也不吭一声也很心累啊。不过过程中倒是把update-alternatives和ln命令学会了:update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk-1.8.0_271/bin/java 300
update-alternatives --install <链接> <名称> <路径> <优先级>
这些参数像让人走进迷宫。
<链接>通常是/usr/bin/[你的程序名称],以java为例就是/usr/bin/java。[你的程序名称]即这里的java就是你最好在终端里敲入的命令java。
<名称>是你自己取的名字,为了怕混乱通常是和<链接>中的[你的程序名称]相同,也是java。
<路径>是你程序的真实物理存储路径,如/usr/lib/jvm/jdk1.8.0_271/bin/java前面都是路径(目录),最后一段java是程序文件,是真实包含代码的文件。不像windows程序或文件都有.exe, .txt等后缀,Linux文件没有后缀,很容易跟目录混淆,非常考验人呐。<优先级>虽然是任意定的整数如200,300,7000等,但是不能少,update-alternatives就是看谁的优先级高(数值越大)就优先调用谁。
这三个参数里每一个都有java,每一个java的意义都不一样,让文科生情何以堪?如果不小心敲错了还得用update-alternatives --remove或–remove-all删除重头再来,为什么没有–edit修改?
管理版本切换的update-alternatives不就是建立软链接命令ln的升级版本嘛。update-alternatives内部一定调用了建立软链接命令ln。为什么看了那么多网络文章就没有一人点破呢?而且同样介绍安装jdk的文章有的用ln命令,有的用update-alternatives,让人莫衷一是。

5.过程中还有一些帮助诊断的命令

(1)whereis java 查找哪些文件/目录里出现了javaroot@localhost:~# whereis java
java: /usr/bin/java /usr/share/java /usr/lib/jvm/jdk1.8.0_271/bin/java /usr/lib/jvm/jdk1.8.0_271/jre/bin/java

(2)update-alternatives --display java 查找哪些软连接命令里出现了java

(3)ls -la /etc/alternatives/etc/alternatives# ls -l java
这时候java类似过滤参数,不是子目录
root@localhost:/home# ls -l /etc/alternatives/javalrwxrwxrwx. 1 root root 38 11月 20 18:4

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/257587?site
推荐阅读
相关标签
  

闽ICP备14008679号