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中了,基本命令如下:

  1. 创建临时文件夹helloworld

    adb shell mkdir -p /data/local/tmp/helloworld
    
  2. 将helloworld.jar push到临时helloworld文件夹中:

    adb push helloworld.jar /data/local/tmp/helloworld
    
  3. 将helloworld.sh push到临时helloworld文件夹中:

    adb push helloworld.sh /data/local/tmp/helloworld
    
  4. 给helloworld.sh提权,使得其有可执行权限

    adb shell chmod 777 /data/local/tmp/helloworld/helloworld.sh
    
  5. 直接执行代码:

    adb shell /data/local/tmp/helloworld/helloworld.sh -p
    

这里的 -p 是我自定义添加的,如果一切运行正常,那么就应该可以看到运行的结果了:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/48015.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

游戏msvcr120.dll丢失怎样修复?msvcr120.dll丢失常见原因

在尝试运行某些游戏时,我遇到了“msvcr120.dll丢失”的错误提示。经过一番调查和尝试,我成功地解决了这个问题。msvcr120.dll是Visual C Redistributable Package的一部分,它包含了许多运行Windows应用程序所需的库和函数。当游戏或其他应用程…

10个好用的网络画图工具推荐,专业办公绘图必备!

在当今数字化时代,网络画图工具成为了各行各业的重要辅助工具。无论是制作流程图、思维导图、原型设计,还是插图绘制、数据可视化,网络画图工具为用户提供了便捷、高效的创作平台。本文将向大家推荐10个好用的网络画图工具,帮助你…

【3D激光SLAM】LOAM源代码解析--transformMaintenance.cpp

系列文章目录 【3D激光SLAM】LOAM源代码解析–scanRegistration.cpp 【3D激光SLAM】LOAM源代码解析–laserOdometry.cpp 【3D激光SLAM】LOAM源代码解析–laserMapping.cpp 【3D激光SLAM】LOAM源代码解析–transformMaintenance.cpp 写在前面 本系列文章将对LOAM源代码进行讲解…

湖南省人民政府副省长秦国文一行莅临麒麟信安调研

(通讯员 付瑞、周沁怡)8月21日,湖南省人民政府副省长秦国文在长沙调研计算产业,省政府副秘书长季心诠、省科技厅厅长李志坚、省工信厅副厅长彭涛、市人民政府副市长肖正波、湘江新区(长沙高新区)管委会副主…

SSM框架的学习与应用(Spring + Spring MVC + MyBatis)-Java EE企业级应用开发学习记录(第二天)Mybatis的深入学习

SSM框架的学习与应用(Spring Spring MVC MyBatis)-Java EE企业级应用开发学习记录(第二天)Mybatis的深入学习(增删改查的操作) 上一篇我们的项目搭建好了,也写了简答的Junit测试类进行测试,可以正确映射…

Lnton羚通算法算力云平台如何在OpenCV-Python中使用cvui库创建复选框

CVUI 之 复选框 Python import numpy as np import cv2 import cvuidef checkbox_test():WINDOW_NAME Checkbox-Testchecked [False]# 创建画布frame np.zeros((300, 400, 3), np.uint8)# 初始化窗口cvui.init(WINDOW_NAME)while True:# 画布填色frame[:] (100, 200, 100…

利用屏幕水印学习英语单词,无打扰英语单词学习

1、利用屏幕水印学习英语单词,不影响任何鼠标键盘操作,不影响工作 2、利用系统热键快速隐藏(ALT1键 隐藏与显示) 3、日积月累单词会有进步 4、软件下载地址: 免安装,代码未加密,安全的屏幕水印学习英语…

机器人TF坐标系变换与一些可视化工具的应用

TF坐标在ROS中是一个非常重要的概念,因为机器人在做日常操作任务的时候,对于其所在位置和朝向是需要时刻知道的,而机器人是由很多节点组成的协同任务,对于每个部件,我们需要知道它的位姿(位置和朝向),这使得…

链表OJ题

今天讲一些关于链表的Oj题,相信你看完对链表又提升一个档次。 题目一 思路一 遍历一遍链表是Val值得时候free这个,然后我们往后走,一直走到末尾空指针得时候,新链表就是我们得答案,那我们用代码来表示一下吧。 struct…

rabbitMQ服务自动停止(已解决

1、 在rabbitmq的sbin目录下操作 rabbitmq-plugins enable rabbitmq_management 2、 自己去rabbitmq_server-3.7.5文件夹下创建一个data,再执行这个命令(用自己的目录哈 set RABBITMQ_BASED:\RabbitTools\RabbitMQ\rabbitmq_server-3.7.5\data 然后去配…

基于YOLOV8模型的西红柿目标检测系统(PyTorch+Pyside6+YOLOv8模型)

摘要:基于YOLOV8模型的西红柿目标检测系统可用于日常生活中检测与定位西红柿目标,利用深度学习算法可实现图片、视频、摄像头等方式的目标检测,另外本系统还支持图片、视频等格式的结果可视化与结果导出。本系统采用YOLOv8目标检测算法训练数…

微信小程序:模板使用

目录 模板的优点: 一、静态模板创建 二、静态模板使用 1.*.wxml引入模板 2.模板使用 3.*.wxss引入模板的样式 三、动态模板创建 四、动态模板使用 1.*.wxml引入模板 2.模板使用 3.*.js定义动态数据 五、结果展示 总结 模板的优点: 有利于保持网…

element-ui中二次封装一个带select的form组件

带select的form组件 样式 代码 <template><el-form-item label"是否有" class"append" prop"tag"><el-form-itemprop"isShare"><el-select v-model"query.tag"><el-option v-for"(item, …

2023年中秋月饼市场趋势分析(月饼京东销售数据分析)

中秋将至&#xff0c;月饼作为节令食品将再次掀起消费热潮。今年月饼市场的需求如何呢&#xff0c;是更受欢迎还是热度有所降低&#xff0c;结合数据我们一起来看今年月饼市场的销售表现。 在这里&#xff0c;我们分别选取了2022年第31周-32周和2023年第31周-32周&#xff08;…

算法通关村第5关【青铜】| Hash和队列的特征

1.Hash基础 &#xff08;1&#xff09;基础 哈希也称为散列&#xff0c;通过算法变成固定长度的输出值&#xff0c;存入对应的位置 例如这个算法为取模算法&#xff0c;indexnumber 模 7 存入1到15 &#xff08;2&#xff09;碰撞处理 当多个元素映射到同一位置上时就产生…

API 接口选择那个?RESTful、GraphQL、gRPC、WebSocket、Webhook

大家好&#xff0c;我是比特桃。目前我们的生活紧紧地被大量互联网服务所包围&#xff0c;互联网上每天都有数百亿次API调用。API 是两个设备相互通讯的一种方式&#xff0c;人们在手机上每次指尖的悦动&#xff0c;背后都是 API 接口的调用。 本文将列举常见的一些 API 接口&…

利用console提高写bug的效率

前端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;前端面试题库 自从入坑前端后&#xff0c;日常写bug就没离开过console。 要说用得多&#xff0c;不如说是console.log用得多&#xff0c;console.warn和console.erro…

2023年最佳JavaScript框架:React、Vue、Angular和Node.js的比较

文章目录 React&#xff1a;构建用户界面的首选Vue&#xff1a;简单优雅的前端框架Angular&#xff1a;Google支持的全面框架Node.js&#xff1a;服务器端的JavaScript运行环境比较不同框架的优势与劣势React&#xff1a;Vue&#xff1a;Angular&#xff1a;Node.js&#xff1a…

怎么查看小程序中的会员信息

商家通过查看会员信息&#xff0c;可以更好地了解用户&#xff0c;并为他们提供更个性化的服务和推荐。接下来&#xff0c;就将介绍如何查看会员信息。 商家在管理员后台->会员管理处&#xff0c;可以查看到会员列表。支持搜索会员的卡号、手机号和等级。还支持批量删除会员…

【Python】数据分析工具之各种图

1 漏斗图 漏斗图描述状态阶段的顺序递进关系&#xff0c;属于序列类图表 import plotly.express as pxdata dict(number[39, 27.4, 20.6, 11, 2],stage["Website visit", "Downloads", "Potential customers", "Requested price", &…