东丽开发区做网站公司,搜索引擎有哪些类型,金戈西地那非片能延时多久,做笑话网站赚钱吗 最近有位老哥问了一个问题#xff0c;说如果将java的jar文件在Android中执行#xff1f;这个其实很简单的一个问题#xff0c;直接写个App放里面不就可以了么#xff1f;但是人家说没有App#xff0c;直接使用命令行去运行。说明这个需求的时候#xff0c;把我给整懵了… 最近有位老哥问了一个问题说如果将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.java2. 编译成dex文件
当生成好 class文件之后我们需要将 class文件编译成 dex文件有两种方式dex和d8。d8是相较于dex更新效果更好的编译方式都是可以在android编译工具文件夹 build-tools下面找到。下面两种方式写法都注明一下
1. dx方式
./Android/sdk/build-tools/28.0.2/dx --outputhelloworld.jar --dex ./bin lib/commons-cli-1.5.0.jar--outputhelloworld.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 是我自定义添加的如果一切运行正常那么就应该可以看到运行的结果了 当然如果你有什么疑问的话可以与我一起探讨可以加我vjavainstalling备注[Jar]即可。