如何通过“jna”(不是来自 windows-cmd)从 linux-bash 运行 c 可执行文件
how to run c executable file from java from linux-bash by " jna" (not from windows-cmd)
对于linux-text,我曾经做过这样的努力:
ProcessBuilder p = new ProcessBuilder("/path/to/file/c/executable");
p.start();
但是我输入输出有问题
这是另一个 suggestion:
Kernel32.java:
public interface Kernel32 extends StdCallLibrary {
----
};
public Kernel32 INSTANCE = (Kernel32) Native.loadLibrary("Kernel32", Kernel32.class, WIN32API_OPTIONS);
----
}
RunTest.java
public class RunTest {
---
static HANDLE inputFile = null;
static void createChildProcess(String cmd){
String szCmdline = cmd;
PROCESS_INFORMATION processInformation = new PROCESS_INFORMATION();
STARTUPINFO startupInfo = new STARTUPINFO();
--
// Create the child process.
if (!Kernel32.INSTANCE.CreateProcess(
--
System.err.println(Kernel32.INSTANCE.GetLastError());
}
else {
com.sun.jna.platform.win32.Kernel32.INSTANCE.WaitForSingleObject(processInformation.hProcess, 0xFFFFFFFF);
---
}
}
static void WriteToPipe()
// Stop when there is no more data.
{
IntByReference dwRead = new IntByReference();
--
for (;;)
{
--
}
与 jni 解决方案 一样,测试时间太长,是否有更简单 指令?
您不需要 JNA 或 JNI(由 JDK 实现的除外)来执行命令。使用 Runtime.exec()
并捕获输出很简单。
我已经在 class here 中实现了这个。您需要的位在下面进行了简化。
public static List<String> runNative(String[] cmdToRunWithArgs, String[] envp) {
Process p = null;
try {
p = Runtime.getRuntime().exec(cmdToRunWithArgs, envp);
return getProcessOutput(p);
} catch (SecurityException | IOException e) {
// handle exception
} finally {
// Ensure all resources are released
if (p != null) {
p.destroy(); // also closes streams except...
// on Windows and Solaris must close streams separately
}
}
return Collections.emptyList(); // or throw exception
}
private static List<String> getProcessOutput(Process p) {
ArrayList<String> sa = new ArrayList<>();
try (BufferedReader reader = new BufferedReader(
new InputStreamReader(p.getInputStream(), Charset.defaultCharset()))) {
String line;
while ((line = reader.readLine()) != null) {
sa.add(line);
}
p.waitFor();
} catch (IOException e) {
// handle exception
} catch (InterruptedException ie) {
// handle exception
Thread.currentThread().interrupt();
}
return sa;
}
然后打电话
String[] envp = new String[] { "LC_ALL=C" };
String[] cmd = new String[] { "/path/to/cmd", "arg1", "arg2" };
List<String> output = runNative(cmd, envp);
对于linux-text,我曾经做过这样的努力:
ProcessBuilder p = new ProcessBuilder("/path/to/file/c/executable");
p.start();
但是我输入输出有问题
这是另一个 suggestion:
Kernel32.java:
public interface Kernel32 extends StdCallLibrary {
----
};
public Kernel32 INSTANCE = (Kernel32) Native.loadLibrary("Kernel32", Kernel32.class, WIN32API_OPTIONS);
----
}
RunTest.java
public class RunTest {
---
static HANDLE inputFile = null;
static void createChildProcess(String cmd){
String szCmdline = cmd;
PROCESS_INFORMATION processInformation = new PROCESS_INFORMATION();
STARTUPINFO startupInfo = new STARTUPINFO();
--
// Create the child process.
if (!Kernel32.INSTANCE.CreateProcess(
--
System.err.println(Kernel32.INSTANCE.GetLastError());
}
else {
com.sun.jna.platform.win32.Kernel32.INSTANCE.WaitForSingleObject(processInformation.hProcess, 0xFFFFFFFF);
---
}
}
static void WriteToPipe()
// Stop when there is no more data.
{
IntByReference dwRead = new IntByReference();
--
for (;;)
{
--
}
与 jni 解决方案 一样,测试时间太长,是否有更简单 指令?
您不需要 JNA 或 JNI(由 JDK 实现的除外)来执行命令。使用 Runtime.exec()
并捕获输出很简单。
我已经在 class here 中实现了这个。您需要的位在下面进行了简化。
public static List<String> runNative(String[] cmdToRunWithArgs, String[] envp) {
Process p = null;
try {
p = Runtime.getRuntime().exec(cmdToRunWithArgs, envp);
return getProcessOutput(p);
} catch (SecurityException | IOException e) {
// handle exception
} finally {
// Ensure all resources are released
if (p != null) {
p.destroy(); // also closes streams except...
// on Windows and Solaris must close streams separately
}
}
return Collections.emptyList(); // or throw exception
}
private static List<String> getProcessOutput(Process p) {
ArrayList<String> sa = new ArrayList<>();
try (BufferedReader reader = new BufferedReader(
new InputStreamReader(p.getInputStream(), Charset.defaultCharset()))) {
String line;
while ((line = reader.readLine()) != null) {
sa.add(line);
}
p.waitFor();
} catch (IOException e) {
// handle exception
} catch (InterruptedException ie) {
// handle exception
Thread.currentThread().interrupt();
}
return sa;
}
然后打电话
String[] envp = new String[] { "LC_ALL=C" };
String[] cmd = new String[] { "/path/to/cmd", "arg1", "arg2" };
List<String> output = runNative(cmd, envp);