Android 命令行如何运行 JAR 文件
最近有位老哥问了一个问题,说如果将java的jar文件在Android中执行?这个其实很简单的一个问题,直接写个App放里面不就可以了么?但是人家说没有App,直接使用命令行去运行。说明这个需求的时候,把我给整懵了,没有很好的思路去想这个问题,所幸查了查资料,发现其实可以在Android中使用命令行来执行jar包命令的。
首先,我们整理一下所需要用到的知识:
- android虚拟机无论是dalvik还是art,都是无法直接运行java的jar文件的,需要有一个中间产物dex,这里就不多说了;
- dex如何手动生成,需要用到dx/d8工具;
- java的常用的编译命令,比如 javac / java cp
- 常用的adb/linux命令,比如adb shell / adb push/ rm -rf 等等命令。
1. java项目
首先我们来看一下我们的java helloworld项目,是一个纯的java项目:

当我们写好了我们的HelloWorld之后,可以手动通过命令行将java文件编译成class文件,命令行如下:
javac -source 1.8 -target 1.8 -d bin -cp lib/commons-cli-1.5.0.jar src/com/xing/HelloWorld.java
这里多说一句,
- -source 1.8 -target 1.8 指定编译的源代码和生成的目标class文件的Java版本都为1.8
- -d 是生成class文件的目录;
- -cp 后面跟的 lib/commons-cli-1.5.0.jar 是我的HelloWorld.java 所依赖的jar包
所以这里编译时需要把它带上。
如果你需要使用 java 11版本,那么编译命令为:
javac -source 11 -target 11 -d bin -cp lib/commons-cli-1.5.0.jar src/com/xing/HelloWorld.java
2. 编译成dex文件
当生成好 class文件之后,我们需要将 class文件编译成 dex文件,有两种方式:dex和d8。d8是相较于dex更新效果更好的编译方式,都是可以在android编译工具文件夹 build-tools下面找到。下面两种方式写法都注明一下:
1. dx方式:
./Android/sdk/build-tools/28.0.2/dx --output=helloworld.jar --dex ./bin lib/commons-cli-1.5.0.jar
--output=helloworld.jar
: 指定输出的dex文件的名称为helloworld.jar--dex
: 指定执行dex转换操作./bin
: 要转换的Java类文件所在目录(刚刚生成的)lib/commons-cli-1.5.0.jar
: 额外的jar库文件,包含可能需要的额外类
2. d8方式:
./Android/sdk/build-tools/33.0.1/d8 --release lib/commons-cli-1.5.0.jar bin/Helloworld.class --output helloworld.jar
--release
:启用release模式优化转换lib/commons-cli-1.5.0.jar
:额外的jar库文件bin/Helloworld.class
:要转换的Java类文件--output helloworld.jar
:输出的dex文件
3. 上传文件
由于需要在Android环境中操作,所以我们先写一个 helloworld.sh 执行命令,该命令的好处是不用一直敲很多命令,直接执行这个.sh文件即可。文件中定义了jar运行的环境,然后最重要一个命令即 “exec app_process” 在Andorid环境中执行jar命令。
base=/data/local/tmp/helloworld
export CLASSPATH=$base/helloworld.jar
export ANDROID_DATA=$base
mkdir -p $base/dalvik-cacheexec app_process $base com.xing.HelloWorld "$@"
其它命令这里就不说了,主要聊一下 app_process的用法:
app_process
:用于启动一个Android应用进程的执行文件,位于/system/bin目录下$base
:Jar包的路径,需要替换为实际的Jar包文件名HelloWorld
:这个是Jar包内的主类,也需要修改为实际的主类名"$@"
:表示传递给Java程序的参数,$@
会扩展成所有参数形式传递进去
那么定义完成 helloworld.sh文件只,主体文件目录就应该如下了:
|-bin
| |____com/xing/HelloWorld.class
|
|-lib
| |____commons-cli-1.5.0.jar
|
|-src
| |____com/xing/HelloWorld.java
|
|-helloworld.jar
|-helloworld.sh
那么我们就需要将目标文件上传到android中了,基本命令如下:
-
创建临时文件夹helloworld
adb shell mkdir -p /data/local/tmp/helloworld
-
将helloworld.jar push到临时helloworld文件夹中:
adb push helloworld.jar /data/local/tmp/helloworld
-
将helloworld.sh push到临时helloworld文件夹中:
adb push helloworld.sh /data/local/tmp/helloworld
-
给helloworld.sh提权,使得其有可执行权限
adb shell chmod 777 /data/local/tmp/helloworld/helloworld.sh
-
直接执行代码:
adb shell /data/local/tmp/helloworld/helloworld.sh -p
这里的 -p 是我自定义添加的,如果一切运行正常,那么就应该可以看到运行的结果了:

当然,如果你有什么疑问的话,可以与我一起探讨,可以加我v:javainstalling,备注[Jar]即可。
相关文章:

Android 命令行如何运行 JAR 文件
最近有位老哥问了一个问题,说如果将java的jar文件在Android中执行?这个其实很简单的一个问题,直接写个App放里面不就可以了么?但是人家说没有App,直接使用命令行去运行。说明这个需求的时候,把我给整懵了…...

5.4 webrtc的线程
那今天呢?我们来了解一下webrtc中的threed,首先我们看一下threed的类,它里边儿都含了哪些内容?由于threed的类非常大啊,我们将它分成两部分。 那第一部分呢,是我们看threed的类中都包含了哪些数据之后呢&a…...

vscode | linux | c++ intelliense 被弃用解决方案
每日一句,vscode用的爽是爽,主要是可配置太强了。如果也很会研究,可以直接去咸鱼接单了 废话少说,直接整。 用着用着说是c intelliense被弃用,很多辅助功能无法使用,像查看定义、查看引用、函数跳转、智能提…...
HPE服务器常见报错信息以及解决方案
General controller issues 常规控制器问题 Controllers are no longer redundant 控制器不再冗余 HPE Dynamic Smart Array B140i drives are not found when RAID mode is disabled 禁用 RAID 模式时找不到 HPE 动态智能阵列 B140i 驱动器 Data located on drives accessed i…...

尚硅谷宋红康MySQL笔记 3-9
我不会记录的特别详细 大体框架 基本的Select语句运算符排序与分页多表查询单行函数聚合函数子查询 第三章 基本的SELECT语句 SQL分类 这个分类有很多种,大致了解下即可 DDL(Data Definition Languages、数据定义语言),定义了…...
Leetcode.2337 移动片段得到字符串
题目链接 Leetcode.2337 移动片段得到字符串 rating : 1693 题目描述 给你两个字符串 start 和 target ,长度均为 n n n 。每个字符串 仅 由字符 L、R 和 _ 组成,其中: 字符 L 和 R 表示片段,其中片段 L 只有在其左侧直接存在一…...

【vue】更改角色权限后,实现页面不刷新更改其可展示的导航菜单
登入的角色本身属于领导级别(集团权限),没有下级的不同权限: 切换不同身份(公司),以获得相应部门的不同导航菜单及权限 这里实现:更改角色权限后,实现页面 不刷新 更改…...

【G-LAB】网络工程师常用排错命令详细版
网络工程师在日常配置中难免出现各种配置错误,比如接口地址配错、掩码位数配错、接口忘记no shutdown。除去这些基础错误,在配置各种路由选择协议时也会因为网络类型、邻居类型、区域和路由器层级等各种问题使邻居无法建立、路由无法传递进而导致网络不通…...
Linux 桌面版关闭GUI桌面环境
持久打开和关闭 通过CtrlAltF1-F6快捷键进入命令行界面 执行以下命令,持久关闭Ubuntu桌面版的GUI环境: sudo systemctl set-default multi-user.target执行以下命令,持久开启Ubuntu桌面版的GUI环境 通过CtrlAltF7快捷键进入GUI界面 sudo s…...

ChatGPT能代替搜索引擎吗?ChatGPT和搜索引擎有什么区别?
ChatGPT和搜索引擎是两种在信息获取和交流中常用的工具,ChatGPT是一种基于人工智能技术的聊天机器人,而搜索引擎是一种在互联网上搜索信息的工具。尽管它们都是依托互联网与信息获取和交流有关,部分功能重合,但在很多方面存在着明…...

PHP海外代购管理系统mysql数据库web结构apache计算机软件工程网页wamp
一、源码特点 PHP 海外代购管理系统是一套完善的web设计系统,对理解php编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。 代码下载 https://download.csdn.net/download/qq_41221322/88229435 论文 https://…...

游戏反外挂方案解析
近年来,游戏市场高速发展,随之而来的还有图谋利益的游戏黑产。在利益吸引下,游戏黑产扩张迅猛,已发展成具有庞大规模的产业链,市面上游戏受其侵扰的案例屡见不鲜。 据《FairGuard游戏安全2022年度报告》数据统计&…...

基于郊狼算法优化的BP神经网络(预测应用) - 附代码
基于郊狼算法优化的BP神经网络(预测应用) - 附代码 文章目录 基于郊狼算法优化的BP神经网络(预测应用) - 附代码1.数据介绍2.郊狼优化BP神经网络2.1 BP神经网络参数设置2.2 郊狼算法应用 4.测试结果:5.Matlab代码 摘要…...

【腾讯云 TDSQL-C Serverless 产品测评】全面测评TDSQL-C Mysql Serverless
全面测评TDSQL-C Mysql Serverless 文章目录 全面测评TDSQL-C Mysql Serverless前言什么是TDSQL-C Mysql Serverless初始化 TDSQL-C Mysql Serverless新建数据库建立数据表开启外网访问 兼容性SQL文件 导入导出navicat 直接在线传输 构建测试环境准备Python测试脚本准备 Jmeter…...

Qt应用开发(基础篇)——纯文本编辑窗口 QPlainTextEdit
一、前言 QPlainTextEdit类继承于QAbstractScrollArea,QAbstractScrollArea继承于QFrame,是Qt用来显示和编辑纯文本的窗口。 滚屏区域基类https://blog.csdn.net/u014491932/article/details/132245486?spm1001.2014.3001.5501框架类QFramehttps://blo…...

数据结构-->栈
💕休对故人思故国,且将新火试新茶,诗酒趁年华💕 作者:Mylvzi 文章主要内容:详解链表OJ题 前言: 前面已经学习过顺序表,链表。他们都是线性表,今天要学习的栈也是一种线…...

强训第36天
C D C 193--1100 0001 194--1100 0010 196--1100 0100 198--1100 0110 能包括全部的且最小的为 1100 0xxx xxx为主机号,站三位 B MAC地址是绑定网卡的,全球唯一 D A C D IP网段 17为网络号 所以是 40.15.1aaa aaa(7位主机号).0 因为要划分2个子网 所以…...
PyTorch bug记录
1、RuntimeError: Input type (torch.FloatTensor) and weight type (torch.cuda.FloatTensor) should be the same 这个错误是因为模型的权重是在GPU上,但是输入数据在CPU上。在PyTorch中,Tensor的类型和所在的设备(CPU或GPU)需…...

js中的正则表达式(一)
目录 1.什么是正则表达式 2.正则表达式在JavaScript中的使用场景: 3.正则表达式的语法: 1.什么是正则表达式 正则表达式(Regular Expression)是用于匹配字符串中字符组合的模式。在JavaScript中,正则表达式也是对象通常用来查找、替换那些符…...

免费开源使用的几款红黑网络流量工具,自动化的多功能网络侦查工具、超级关键词URL采集工具、Burpsuite被动扫描流量转发插件
免费开源使用的几款红黑网络流量工具,自动化的多功能网络侦查工具、超级关键词URL采集工具、Burpsuite被动扫描流量转发插件。 #################### 免责声明:工具本身并无好坏,希望大家以遵守《网络安全法》相关法律为前提来使用该工具&am…...

接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...

DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...

均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...

OPENCV形态学基础之二腐蚀
一.腐蚀的原理 (图1) 数学表达式:dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一,腐蚀跟膨胀属于反向操作,膨胀是把图像图像变大,而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

技术栈RabbitMq的介绍和使用
目录 1. 什么是消息队列?2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...

回溯算法学习
一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...
Web中间件--tomcat学习
Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机,它可以执行Java字节码。Java虚拟机是Java平台的一部分,Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...