Android控制檯中執行Java程式
阿新 • • 發佈:2019-02-12
測試程式碼(TCP通訊服務端)
package com.demo;
import java.io.InputStream;
import java.io.DataInputStream;
import java.io.OutputStream;
import java.io.DataOutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;
/*
* 基於TCP協議的Socket通訊
* 伺服器端
*/
public class Hello {
public static void main(String[] args) {
try {
//1.建立一個伺服器端Socket,即ServerSocket,指定繫結的埠,並監聽此埠
ServerSocket serverSocket = new ServerSocket(8888);
Socket socket=null;
//記錄客戶端的數量
int count=0;
System.out.println("\n***Start the server and wait for the client to connect***" );
//迴圈監聽等待客戶端的連線
while(true){
//呼叫accept()方法開始監聽,等待客戶端的連線
socket=serverSocket.accept();
//建立一個新的執行緒
ServerThread serverThread = new ServerThread(socket);
//啟動執行緒
serverThread.start();
count++;//統計客戶端的數量
System.out.println("The number of clients: "+count);
InetAddress address=socket.getInetAddress();
System.out.println("Current client IP: "+address.getHostAddress());
}
} catch (Exception e) {
e.printStackTrace();
}
}
/*
* 伺服器執行緒處理類
*/
public static class ServerThread extends Thread {
// 和本執行緒相關的Socket
Socket socket = null;
public ServerThread(Socket socket) {
this.socket = socket;
}
//執行緒執行的操作,響應客戶端的請求
public void run(){
InputStream inputStream = null;
DataInputStream dataInputStream = null;
OutputStream outputStream = null;
DataOutputStream dataOutputStream = null;
try {
//獲取輸入流,並讀取客戶端資訊
inputStream = socket.getInputStream();
dataInputStream = new DataInputStream(inputStream);
//獲取輸出流,響應客戶端的請求
outputStream = socket.getOutputStream();
dataOutputStream = new DataOutputStream(outputStream);
while (true) {
//迴圈讀取客戶端的資訊
byte b[] = new byte[1024];
b[0] = '\0';
dataInputStream.read(b);
String info = new String(b);
System.out.println("I am a server and the client says: "+info);
if (info.trim().equals("quit")) {
break;
}
dataOutputStream.write("Welcome to visit!".getBytes("UTF-8"));
dataOutputStream.flush();//呼叫flush()方法將緩衝輸出
}
} catch (Exception e) {
e.printStackTrace();
}finally{
//關閉資源
try {
if(socket != null) {
socket.shutdownInput();//關閉輸入流
socket.shutdownOutput();//關閉輸出流
}
if(dataOutputStream != null) {
dataOutputStream.close();
}
if(outputStream != null) {
outputStream.close();
}
if (dataInputStream != null) {
dataInputStream.close();
}
if(inputStream != null) {
inputStream.close();
}
if(socket != null) {
socket.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
}
目錄結構
原始碼:src/com/demo/Hello.java
編譯後文件目錄(和src同級):bin
編譯
javac -sourcepath ./src ./src/com/demo/Hello.java -d ./bin -encoding utf-8
將Java class轉Android class
cd bin
dx --dex --output=Hello.dex ./com/demo/*.class
注意
如果出現以下異常資訊,則表示jdk版本過高,而這個dx命令還不支援,如使用jdk版本是1.8,而這個dx命令還不支援1.8的jdk。那麼需要重新編譯。
UNEXPECTED TOP-LEVEL EXCEPTION:
com.android.dx.cf.iface.ParseException: bad class file magic (cafebabe) or version (0034.0000)
at com.android.dx.cf.direct.DirectClassFile.parse0(DirectClassFile.java:472)
at com.android.dx.cf.direct.DirectClassFile.parse(DirectClassFile.java:406)
at com.android.dx.cf.direct.DirectClassFile.parseToInterfacesIfNecessary(DirectClassFile.java:388)
at com.android.dx.cf.direct.DirectClassFile.getMagic(DirectClassFile.java:251)
at com.android.dx.command.dexer.Main.processClass(Main.java:704)
at com.android.dx.command.dexer.Main.processFileBytes(Main.java:673)
at com.android.dx.command.dexer.Main.access$300(Main.java:83)
at com.android.dx.command.dexer.Main$1.processFileBytes(Main.java:602)
at com.android.dx.cf.direct.ClassPathOpener.processOne(ClassPathOpener.java:170)
at com.android.dx.cf.direct.ClassPathOpener.process(ClassPathOpener.java:144)
at com.android.dx.command.dexer.Main.processOne(Main.java:632)
at com.android.dx.command.dexer.Main.processAllFiles(Main.java:510)
at com.android.dx.command.dexer.Main.runMonoDex(Main.java:280)
at com.android.dx.command.dexer.Main.run(Main.java:246)
at com.android.dx.command.dexer.Main.main(Main.java:215)
at com.android.dx.command.Main.main(Main.java:106)
...while parsing com/demo/Hello.class
重新編譯,並忽略警告資訊,最後再重新將Java class轉Android class
javac -sourcepath ./src -source 1.7 -target 1.7 ./src/com/demo/Hello.java -d ./bin -encoding utf-8
將Hello.dex推送到Android裝置中
adb push Hello.dex /data/local/tmp
執行
export CLASSPATH=/data/local/tmp/Hello.dex
exec app_process /data/local/tmp com.demo.Hello
以上兩條命令可以通過下面一條執行:
exec app_process -Djava.class.path=/data/local/tmp/Hello.dex /data/local/tmp com.demo.Hello