Andorid利用sserver/runtime实现java执行linux程序或脚本

2024-03-15 14:32

本文主要是介绍Andorid利用sserver/runtime实现java执行linux程序或脚本,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

方案一:利用sserver

external/server_mount/socket_server.c

#define THE_PORT 8090

方案二:利用runtime

Runtime runtime = Runtime.getRuntime();

Process process = runtime.exec(cmd);

下面介绍可以独立与Android的方案一:

1.sserver部分可以移植出Android部分代码

socket_server.c

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>#define THE_PORT 8090
#define CLIENT_NUM 10
#define BUFFSZ 1024int main()
{int socketfd;int clientfd;char buff[BUFFSZ];struct sockaddr_in sa;struct sockaddr_in cliAdd;socketfd = socket(AF_INET, SOCK_STREAM, 0);if(socketfd == -1){printf("socket create error\n");exit(1);}bzero(&sa, sizeof(sa));sa.sin_family = AF_INET;sa.sin_port = htons(THE_PORT);sa.sin_addr.s_addr = htons(INADDR_ANY);bzero(&(sa.sin_zero), 8);if(bind(socketfd, (struct sockaddr *)&sa, sizeof(sa))!= 0){printf("bind failed\n");exit(1);}if(listen(socketfd ,CLIENT_NUM) != 0){printf("listen error\n");exit(1);}else{printf("listening\n");}socklen_t len = sizeof(cliAdd);int closing =0;while( closing == 0 && (clientfd = accept(socketfd, (struct sockaddr *)&cliAdd, &len)) >0 ){int n;while((n = recv(clientfd,buff, BUFFSZ-1,0 )) > 0){printf("received data = %s\n",buff);printf("received bytes = %d\n", n);buff[n] = '\0';proc_cmd(clientfd , buff);if(strcmp(buff, "quit") == 0){//connection closebreak;}else if(strcmp(buff, "close") == 0){//server closeclosing = 1;printf("server is closing\n");break;}}close(clientfd);}close(socketfd);return 0;
}
void proc_cmd(int sockfd,char buf[])
{char cmdbuf[BUFFSZ];char fpath[64] = "/data/mtinfo";FILE *fp;printf("proc_cmd now\n");sprintf(cmdbuf,"%s 2> %s",buf,fpath);if(-1 == system(cmdbuf)){printf("system call failed\n");exit(1);}if((fp = fopen(fpath,"r")) == -1){printf("open file %s failed\n",fpath);exit(1);}if(!fgets(cmdbuf,sizeof(buf),fp))//cmd successed{printf("----->cmd successed\n");if(send(sockfd,"ok",2,0)<0){perror("send error");exit(1);}		}else//fail{printf("----->cmd fail\n");if(send(sockfd,"fail",4,0)<0){perror("send error");exit(1);	}		}
}

gcc socket_server.c -o server

2.java部分

HelloWorld.java

public class HelloWorld{public static void main(String args[]){System.out.println("Hello World!");RootSeeker.exec("ls");      }
}
RootSeeker.java

//package com.android.server.am.utils;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;//import android.util.Log;public class RootSeeker {private static final String TAG = "RootSeeker";private static final int SOCKET_PORT = 8090;private static final String SOCKET_IP = "127.0.0.1";public static int exec(String cmd) {Log.d(TAG, "<-----------------in exec() start --------------------->");//Log.d(TAG, "exec cmd: " + cmd);Socket socket;BufferedReader in;PrintWriter out;char []buf = new char[256];int ret = 0;try	{socket = new Socket(SOCKET_IP, SOCKET_PORT);in = new BufferedReader(new InputStreamReader(socket.getInputStream()));out = new PrintWriter(socket.getOutputStream(),true);BufferedReader line = new BufferedReader(new InputStreamReader(System.in));out.println(cmd);if (in.read(buf) != -1 && new String(buf).equals(new String("ok")))ret = 0;else ret = -1;//Log.d(TAG, "command execute " + ((ret == 0) ? "ok" : "false") + ", return: -->" +buf);line.close();out.close();in.close();socket.close();return 0;	//FIXME}catch (IOException e){//Log.d(TAG, e.toString());}return 0;}public static boolean chmod(String fileName) {String cmd = "chmod 777 " + fileName;System.out.println("cmd =" + cmd);try {Runtime runtime = Runtime.getRuntime();Process process = runtime.exec(cmd);return true;} catch (Exception e) {e.printStackTrace();return false;}}}
javac RootSeeker.java HelloWorld.java

3.运行

一个终端执行./server

另一个终端执行

CLASSPATH=$CLASSPATH:.

echo $CLASSPATH

java HelloWorld

结果分别为:

listening
received data = lsreceived bytes = 3
proc_cmd now
HelloWorld.class  HelloWorld.java  RootSeeker.class  RootSeeker.java  server  socket_server.c


Hello World!














这篇关于Andorid利用sserver/runtime实现java执行linux程序或脚本的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/812279

相关文章

Java实现优雅日期处理的方案详解

《Java实现优雅日期处理的方案详解》在我们的日常工作中,需要经常处理各种格式,各种类似的的日期或者时间,下面我们就来看看如何使用java处理这样的日期问题吧,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言一、日期的坑1.1 日期格式化陷阱1.2 时区转换二、优雅方案的进阶之路2.1 线程安全重构2

Android实现两台手机屏幕共享和远程控制功能

《Android实现两台手机屏幕共享和远程控制功能》在远程协助、在线教学、技术支持等多种场景下,实时获得另一部移动设备的屏幕画面,并对其进行操作,具有极高的应用价值,本项目旨在实现两台Android手... 目录一、项目概述二、相关知识2.1 MediaProjection API2.2 Socket 网络

Java中的JSONObject详解

《Java中的JSONObject详解》:本文主要介绍Java中的JSONObject详解,需要的朋友可以参考下... Java中的jsONObject详解一、引言在Java开发中,处理JSON数据是一种常见的需求。JSONObject是处理JSON对象的一个非常有用的类,它提供了一系列的API来操作J

使用Python实现图像LBP特征提取的操作方法

《使用Python实现图像LBP特征提取的操作方法》LBP特征叫做局部二值模式,常用于纹理特征提取,并在纹理分类中具有较强的区分能力,本文给大家介绍了如何使用Python实现图像LBP特征提取的操作方... 目录一、LBP特征介绍二、LBP特征描述三、一些改进版本的LBP1.圆形LBP算子2.旋转不变的LB

Redis消息队列实现异步秒杀功能

《Redis消息队列实现异步秒杀功能》在高并发场景下,为了提高秒杀业务的性能,可将部分工作交给Redis处理,并通过异步方式执行,Redis提供了多种数据结构来实现消息队列,总结三种,本文详细介绍Re... 目录1 Redis消息队列1.1 List 结构1.2 Pub/Sub 模式1.3 Stream 结

SpringBoot多数据源配置完整指南

《SpringBoot多数据源配置完整指南》在复杂的企业应用中,经常需要连接多个数据库,SpringBoot提供了灵活的多数据源配置方式,以下是详细的实现方案,需要的朋友可以参考下... 目录一、基础多数据源配置1. 添加依赖2. 配置多个数据源3. 配置数据源Bean二、JPA多数据源配置1. 配置主数据

C# Where 泛型约束的实现

《C#Where泛型约束的实现》本文主要介绍了C#Where泛型约束的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录使用的对象约束分类where T : structwhere T : classwhere T : ne

将Java程序打包成EXE文件的实现方式

《将Java程序打包成EXE文件的实现方式》:本文主要介绍将Java程序打包成EXE文件的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录如何将Java程序编程打包成EXE文件1.准备Java程序2.生成JAR包3.选择并安装打包工具4.配置Launch4

SpringBoot内嵌Tomcat临时目录问题及解决

《SpringBoot内嵌Tomcat临时目录问题及解决》:本文主要介绍SpringBoot内嵌Tomcat临时目录问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录SprinjavascriptgBoot内嵌Tomcat临时目录问题1.背景2.方案3.代码中配置t

SpringBoot使用GZIP压缩反回数据问题

《SpringBoot使用GZIP压缩反回数据问题》:本文主要介绍SpringBoot使用GZIP压缩反回数据问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录SpringBoot使用GZIP压缩反回数据1、初识gzip2、gzip是什么,可以干什么?3、Spr