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
node in android Umgebung, um Java mit Android auszuführen
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
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.
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();
}
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);
}
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();
}
Damit ist die Erklärung zum Ausführen von node.js unter Android Java (Verarbeitung) abgeschlossen. Hast du es getan?
Recommended Posts