1. 程式人生 > >Android控制檯中執行Java程式

Android控制檯中執行Java程式

測試程式碼(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