Примечание: вы должны только использовать этот метод, когда вам абсолютно необходим терминал / консоль, например, как требуется vim. Для всех других целей используйте Runtime.exec ().
У меня была такая же проблема. Я начал использовать собственный интерфейс Java для вызова небольшой функции c, выполняющей системный вызов:
SystemProcess.java:
class SystemProcess {
public native int systemCall(String cmd);
public boolean execute() { return systemCall("vim test") == 0; }
static { System.loadLibrary("SystemProcess"); }
}
SystemProcess.c
#include [javah-generated-header.h]
[javah-generated-function-prototype] (JNIEnv *env, jobject obj, jstring jcmd) {
jboolean iscopy;
const char *cmd = (*env)->GetStringUTFChars(env, jcmd, &iscopy);
jint ec = system(cmd);
(*env)->ReleaseStringUTFChars(env, jcmd, cmd);
return ec;
}
Я оставлю на ваше усмотрение, как на самом деле делать все генерацию заголовков и c компиляцию в разделяемую библиотеку. Не стесняйтесь заменить систему на fork / exec или posix_spawn, если вам от этого станет легче. Но по большей части это должно работать как есть на Unix / Linux.