與this answer結合@chrylis's pointer並做了一點調整,我終於結束了之後是:
- 創建和編譯Java類機方法簽名
- 使用
javah
生成C頭文件
- 創建
.cpp
文件,執行功能isatty
- 將C++代碼編譯到共享庫中
- 運行Java程序,使用
-Djava.library.path=...
告訴它你的自定義庫是
Java類:
package com.example.cli;
class LinuxTerminalSupport {
public native boolean isStderrVisible();
static {
System.loadLibrary("term");
}
}
Ant目標產生.h
:
<target name="generate-native-headers">
<javah destdir="native/" verbose="yes">
<classpath refid="compile.class.path"/>
<class name="com.example.cli.LinuxTerminalSupport" />
</javah>
</target>
.cpp文件:
#include "com_example_cli_LinuxTerminalSupport.h"
#include "unistd.h"
using namespace std;
JNIEXPORT jboolean JNICALL Java_com_example_cli_LinuxTerminalSupport_isStderrVisible(JNIEnv * env, jobject obj) {
return isatty(fileno(stderr)) == 1;
}
Makefile
(改變Java包含以反映您$JAVA_HOME
):
linux: LinuxTerminalSupport.o
g++ -I/usr/java/jdk1.6.0_13/include -I/usr/java/jdk1.6.0_13/include/linux \
-o libterm.so -shared -Wl,-soname,term.so LinuxTerminalSupport.o -lc
LinuxTerminalSupport.o: LinuxTerminalSupport.cpp
g++ -c -I/usr/java/jdk1.6.0_13/include -I/usr/java/jdk1.6.0_13/include/linux LinuxTerminalSupport.cpp
http://stackoverflow.com/questions/3643939/java-process-with-input-output-stream 享受 – UberDoyle
@UberDoyle我我不問有關使用Java啓動另一個進程的問題。我想知道* current *進程的STDERR是否被重定向。 –