Führen Sie node.js von Android Java aus (Verarbeitung)

Einführung

Haben Sie jemals etwas anderes als Java auf Android ausgeführt? Wenn Sie es nur ausführen möchten, können Sie es häufig mit termux oder einer Anwendung für jede Sprache ausführen, aber es ist schwierig, es in apk zu packen und zu verteilen (ich war frustriert über Python). Es gibt jedoch einige wie Node.js, die dieses Mal eingeführt wurden und nach der Weisheit unserer Vorgänger eine Möglichkeit haben, mit Android zu arbeiten. Lassen Sie uns die Einführung bis jetzt beenden und sehen, wie es tatsächlich geht

Dinge notwendig

node in android Umgebung, um Java mit Android auszuführen

Vorbereitung

Lassen Sie uns das, was wir brauchen, in Vermögenswerte stecken Ich brauche vorerst keine npm Legen Sie die heruntergeladene Datei mit dem Namen node in Assets / resource / bin ab Fügen Sie je nach Bedarf die Berechtigung WriteExternalStorage oder readExternalStorage hinzu. import Zunaechst

import java.io.IOException;
import java.util.Map;
import fi.iki.elonen.*;
import android.content.res.AssetManager;
import android.os.Bundle;
import java.io.*;
import java.util.*;

Bitte importieren

Funktionen zum Kopieren von Assets nach localStorage

Es können nur Dateien in localStorage ausgeführt werden. Verschieben Sie sie daher mit der Funktion copyFiles aus Assets.

private boolean isDirectory(final String path) throws IOException { 
  AssetManager assetManager = getActivity().getResources().getAssets();
  boolean isDirectory = false;
  try {
    if (assetManager.list(path).length > 0) {
      isDirectory = true;
    } else {
      assetManager.open(path);
    }
  }
  catch (FileNotFoundException fnfe) {
    isDirectory = true;
  }
  return isDirectory;
}
private void copyFiles(final String parentPath, final String filename, final File toDir) throws IOException {
  AssetManager assetManager = getActivity().getResources().getAssets();
  String assetpath = (parentPath != null ? parentPath + File.separator + filename : filename);
  if (isDirectory(assetpath)) {
    if (!toDir.exists()) {
      toDir.mkdirs();
    } 
    for (String child : assetManager.list(assetpath)) {
      copyFiles(assetpath, child, new File(toDir, child));
    }
  } else {
    copyData(assetManager.open(assetpath), new FileOutputStream(new File(toDir.getParentFile(), filename)));
  }
}
private void copyData(InputStream input, FileOutputStream output) throws IOException {
  int DEFAULT_BUFFER_SIZE = 1024 * 4; 	
  byte[] buffer = new byte[DEFAULT_BUFFER_SIZE]; 	
  int n = 0; 		
  while (-1 != (n = input.read(buffer))) { 
    output.write(buffer, 0, n);
  } 		
  output.close(); 		
  input.close();
}

Bitte ändern Sie den Teil von getContext () und getActivity () in einen geeigneten.

Funktion zum Aufrufen von node.js

Rufen Sie node.js mit der Funktion adbCommandExe auf Die Funktion tracePath gibt den Speicherort von localstorage zurück Die Funktion addEnv fügt eine Umgebungsvariable hinzu

String sketchPath(String path){
  return getContext().getFilesDir().getAbsolutePath()+"/"+path;
}
void addEnv(ProcessBuilder pb,String e,String value){
  Map<String, String> env = pb.environment();
  env.put(e,value);
}
private String adbCommandExe(String command,File dir) {
  StringBuilder suilder = new StringBuilder();
  ProcessBuilder processBuilder = new ProcessBuilder(command.split(" "));
  if(dir!=null)processBuilder.directory(dir);
  addEnv(processBuilder,"LD_LIBRARY_PATH",sketchPath("lib"));
  addEnv(processBuilder,"PATH",sketchPath("bin"));
  addEnv(processBuilder,"LANG","en_US.UTF-8");
  InputStream iStream = null;
  InputStreamReader isReader = null;
  try {
    Process proc = processBuilder.start();
    iStream = proc.getInputStream();
    isReader = new InputStreamReader(iStream);
    BufferedReader bufferedReader = new BufferedReader(isReader);
    String line;
    while ((line = bufferedReader.readLine()) != null) {
      suilder.append(line);
      suilder.append("\n");
      println(line);
    }
    BufferedReader br = new BufferedReader(new InputStreamReader(proc.getErrorStream())); 
    while ((line = br.readLine()) != null) { 
      suilder.append(line);
      suilder.append("\n");
      println(line);
    }
  }
  catch(Exception e) {
    e.printStackTrace();
  } 
  finally {
    try {
      if (iStream != null) {
        iStream.close();
      }
      if (isReader != null) {
        isReader.close();
      }
    } 
    catch(Exception e) {
      e.printStackTrace();
    }
  }
  return suilder.toString();
}

Lauf

Rufen Sie tatsächlich die Funktion auf

void run(){
  try {
    copyFiles(null, "resource", new File(sketchPath("")));
  } 
  catch (IOException ioe) { 
    println("copy error");
  }
  for(File file:new File(sketchPath("bin")).listFiles()){
    if (file.setExecutable(true, true))println("a");
  }
  for(File file:new File(sketchPath("lib")).listFiles()){
    if (file.setExecutable(true, true))println("a");
  }
  File dir = new File("/storage/emulated/0/webIDE/temp");
  adbCommandExe("node -v",dir);
}

Alles zusammen

Versuchen Sie, die Ausführungsfunktion aufzurufen, wenn Sie node.js ausführen möchten

void run(){
  try {
    copyFiles(null, "resource", new File(sketchPath("")));
  } 
  catch (IOException ioe) { 
    println("copy error");
  }
  for(File file:new File(sketchPath("bin")).listFiles()){
    if (file.setExecutable(true, true))println("a");
  }
  for(File file:new File(sketchPath("lib")).listFiles()){
    if (file.setExecutable(true, true))println("a");
  }
  File dir = new File("/storage/emulated/0/webIDE/temp");
  adbCommandExe("node -v",dir);
}
String sketchPath(String path){
  return getContext().getFilesDir().getAbsolutePath()+"/"+path;
}
void addEnv(ProcessBuilder pb,String e,String value){
  Map<String, String> env = pb.environment();
  env.put(e,value);
}
private String adbCommandExe(String command,File dir) {
  StringBuilder suilder = new StringBuilder();
  ProcessBuilder processBuilder = new ProcessBuilder(command.split(" "));
  if(dir!=null)processBuilder.directory(dir);
  addEnv(processBuilder,"LD_LIBRARY_PATH",sketchPath("lib"));
  addEnv(processBuilder,"PATH",sketchPath("bin"));
  addEnv(processBuilder,"LANG","en_US.UTF-8");
  InputStream iStream = null;
  InputStreamReader isReader = null;
  try {
    Process proc = processBuilder.start();
    iStream = proc.getInputStream();
    isReader = new InputStreamReader(iStream);
    BufferedReader bufferedReader = new BufferedReader(isReader);
    String line;
    while ((line = bufferedReader.readLine()) != null) {
      suilder.append(line);
      suilder.append("\n");
      println(line);
    }
    BufferedReader br = new BufferedReader(new InputStreamReader(proc.getErrorStream())); 
    while ((line = br.readLine()) != null) { 
      suilder.append(line);
      suilder.append("\n");
      println(line);
    }
  }
  catch(Exception e) {
    e.printStackTrace();
  } 
  finally {
    try {
      if (iStream != null) {
        iStream.close();
      }
      if (isReader != null) {
        isReader.close();
      }
    } 
    catch(Exception e) {
      e.printStackTrace();
    }
  }
  return suilder.toString();
}
private boolean isDirectory(final String path) throws IOException { 
  AssetManager assetManager = getActivity().getResources().getAssets();
  boolean isDirectory = false;
  try {
    if (assetManager.list(path).length > 0) {
      isDirectory = true;
    } else {
      assetManager.open(path);
    }
  }
  catch (FileNotFoundException fnfe) {
    isDirectory = true;
  }
  return isDirectory;
}
private void copyFiles(final String parentPath, final String filename, final File toDir) throws IOException {
  AssetManager assetManager = getActivity().getResources().getAssets();
  String assetpath = (parentPath != null ? parentPath + File.separator + filename : filename);
  if (isDirectory(assetpath)) {
    if (!toDir.exists()) {
      toDir.mkdirs();
    } 
    for (String child : assetManager.list(assetpath)) {
      copyFiles(assetpath, child, new File(toDir, child));
    }
  } else {
    copyData(assetManager.open(assetpath), new FileOutputStream(new File(toDir.getParentFile(), filename)));
  }
}
private void copyData(InputStream input, FileOutputStream output) throws IOException {
  int DEFAULT_BUFFER_SIZE = 1024 * 4; 	
  byte[] buffer = new byte[DEFAULT_BUFFER_SIZE]; 	
  int n = 0; 		
  while (-1 != (n = input.read(buffer))) { 
    output.write(buffer, 0, n);
  } 		
  output.close(); 		
  input.close();
}

Nachwort

Damit ist die Erklärung zum Ausführen von node.js unter Android Java (Verarbeitung) abgeschlossen. Hast du es getan?

Recommended Posts

Führen Sie node.js von Android Java aus (Verarbeitung)
Führen Sie eine Batchdatei von Java aus
Wiedereinführung von Java8, das seit Android Studio 2.4 verfügbar ist
Datenverarbeitung mit der Stream-API von Java 8
Rufen Sie Java von C ++ auf Android NDK auf
Java-Thread-Verarbeitung
Java-String-Verarbeitung
[Java] Multithread-Verarbeitung
[Java] Stream-Verarbeitung
Java iterativer Prozess
[Android] Rufen Sie Kotlins Standardargumentmethode von Java aus auf
Führen Sie Rust von Java mit JNA (Java Native Access) aus.
R von Java ausführen Ich möchte rJava ausführen
[Android / Java] Bildschirmübergang und Rückgabeverarbeitung in Fragmenten
Rufen Sie Java von JRuby aus auf
Änderungen von Java 8 zu Java 11
Summe von Java_1 bis 100
Eval Java-Quelle von Java
Führen Sie PostgreSQL unter Java aus
Greifen Sie über Java auf API.AI zu
Von Java zu Ruby !!
JAVA-Konstruktoraufrufverarbeitung
Rufen Sie ein in Swift geschriebenes Programm von Processing (Java) auf.
Java zufällig, verschiedene Verarbeitung
Führen Sie die Verarbeitung auf Ant aus
Java, das Daten von Android zu Jetson Nanos ROS überspringt
Führen Sie R von einem Tomcat-basierten Java-Prozess unter Amazon Linux aus
Überprüfen Sie die Kommunikation von Android zum node.js-Server mit Protokollpuffern
Migration von Cobol nach JAVA
Führen Sie Batch mit Docker-Compose mit Java-Batch aus
[Java] Multithread-Verarbeitung - Exklusive Steuerung
Java ab Anfänger überschreiben
Elastic Search Indexerstellung aus Java
Neue Funktionen von Java7 bis Java8
Stellen Sie eine Verbindung von Java zu PostgreSQL her
Java Hallo Welt, kompilieren, ausführen
Java, Instanz für Anfänger
[Java] Stream API - Stream-Beendigungsverarbeitung
[Java] Stream API - Stream Zwischenverarbeitung
[Java] Implementierungsmethode für die Timer-Verarbeitung
Führen Sie das Java-Applet auf Ubuntu aus
Java ab Anfänger, Vererbung
Gemessene Parallelverarbeitung mit Java
Grundlegendes zur Java-Parallelverarbeitung (Einführung)
Java-Leben von vorne anfangen
[Java] [Android] INI-Datei lesen
Verwenden von Docker von Java Gradle
Von ineffektivem Java zu effektivem Java
JavaScript von Java aus gesehen
Führen Sie Java VM mit Web Assembly aus
Zusammenfassung der Java-Fehlerverarbeitung
[Android / Java] Erfahren Sie mehr über DataBinding
Führen Sie Nicht-Java-Anweisungen von Java aus
Android: Umgang mit "Java-Version von '10 .0.1 'konnte nicht ermittelt werden"
[Android, Java] Methode zum Ermitteln des abgelaufenen Datums aus zwei Daten
Vom jungen Java (3 Jahre) bis zu Node.js (4 Jahre). Und der Eindruck, nach Java zurückzukehren