java調用linuxc
1. linux:用java調用Linux指令,這里的-c是什麼意思呢
-c string
If the -c option is present, then commands are read from string. If there are arguments after the string, they are assigned to the positional parameters, starting with $0.
翻譯一下就是: 如果-c 選項存在,命令就從字元串中讀取。如果字元串後有參數,他們將會被分配到參數的位置上,從$0開始。
2. 如何在java程序中調用linux命令或者shell腳本
在java程序中如何調用linux的命令?如何調用shell腳本呢?
這里不得不提到java的process類了。
process這個類是一個抽象類,封裝了一個進程(你在調用linux的命令或者shell腳本就是為了執行一個在linux下執行的程序,所以應該使用process類)。
process類提供了執行從進程輸入,執行輸出到進程,等待進程完成,檢查進程的推出狀態,以及shut down掉進程。
至於詳細的process類的介紹放在以後介紹。
另外還要注意一個類:Runtime類,Runtime類是一個與JVM運行時環境有關的類,這個類是Singleton的。
這里用到的Runtime.getRuntime()方法是取得當前JVM的運行環境,也是java中唯一可以得到運行環境的方法。(另外,Runtime的大部分方法都是實例方法,也就是說每次運行調用的時候都需要調用到getRuntime方法)
下面說說Runtime的exec()方法,這里要注意的有一點,就是public Process exec(String [] cmdArray, String [] envp);這個方法中cmdArray是一個執行的命令和參數的字元串數組,數組的第一個元素是要執行的命令往後依次都是命令的參數,envp感覺應該和C中的execve中的環境變數是一樣的,envp中使用的是name=value的方式。
下面說一下,如何使用process來調用shell腳本
例如,我需要在linux下實行linux命令:sh test.sh,下面就是執行test.sh命令的方法:
這個var參數就是日期這個201102包的名字。
String shpath="/test/test.sh"; //程序路徑
Process process =null;
String command1 = 「chmod 777 」 + shpath;
process = Runtime.getRuntime().exec(command1);
process.waitFor();
String var="201102"; //參數
String command2 = 「/bin/sh 」 + shpath + 」 」 + var;
Runtime.getRuntime().exec(command2).waitFor();
3. java如何向linux下C語言傳遞參數
public
Process
exec(String
[]
cmdArray,
String
[]
envp,File
dir);
這個方法中cmdArray是一個執行的命令和參數的字元串數組,數組的第一個元素是要執行的命令往後依次都是命令的參數,envp是執行的環境,,envp中使用的是name=value的方式。File
dir是執行目錄。
獲取返回使用process.getInputStream()
這樣能和shell進行交互,可以把C代碼編譯了,再通過這也方法來調用和傳遞參數
4. Linux環境下java調用C
你的JNI 寫錯了吧
java里的 char和 C的char完全不是一回事
java里你要寫 stringjava_encryptpswd(string Password, string EncryptedKey );
生成的 C頭文件,應該是 jstring java_encryptpswd(JEnvi* pEnvi,jstring Password,jstring EncryptedKey)
我手寫的,沒查資料,大概是這樣。。
然後第一個參數是當前虛擬機事例,裡面有很多可用的函數
後面兩個是java里字元串結構,在C裡面的表示法, 其實它就是指針而已。
然後你可以用pEnvi里的函數,將java的string,轉化成 c的string。
然後調用 C的頭文件的函數,得到結果,在組裝成java的字元串。
比如例子:
我要用C來實現 java的字元串定位。
No.1 定義java的本地介面
public native String NAConvert(String arg1,String arg2);
No.2 生成頭文件
JNIEXPORT jstring JNICALL Java_com_test_mainandroid_MainAndroidNative_NAConvert
(JNIEnv *, jobject, jstring, jstring);
No.3 自己創建一個實現文件,實現上面函數
jstring Java_com_test_mainandroid_MainAndroidNative_NAConvert
(JNIEnv* env, jobject obj, jstring arg1, jstring arg2)
{
jsize len = env->GetStringLength(arg1);
jchar* pBuf = new jchar[len+1];
env->GetStringRegion(arg1,0,len,pBuf);
jclass m = env->FindClass("java/lang/String");
jmethodID mid = env->GetMethodID(m,"charAt","(I)C");
jchar c = env->CallCharMethod(arg1,mid,1);
return arg1 ;
}
第一個是虛擬機事例指針,第二個參數是介面方法所在對象的 this。
第三個及以後才是你的介面的參數。
java里傳入的所有對象參數,在C裡面都是句柄。必須要用第一個參數env才能解析其中含義。
5. java如何向linux下C語言傳遞參數
public Process exec(String [] cmdArray, String [] envp,File dir);
這個方法中cmdArray是一個執行的命令和參數的字元串數組,數組的第一個元素是要執行的命令往後依次都是命令的參數,envp是執行的環境,,envp中使用的是name=value的方式。File dir是執行目錄。
獲取返回使用process.getInputStream()
這樣能和shell進行交互,可以把C代碼編譯了,再通過這也方法來調用和傳遞參數
6. 如何在java程序中調用linux命令或者shell腳本
java程序是提供了這個一方法,Processpro=Runtime.getRuntime().exec(cmds);
但是一般來說,盡量去用一些其他腳本(lua,shell,python)去執行一系列linux命令比較靈活, 而且耗費資源少。但是Runtime.getRuntime().exec()這種調用方式在java虛擬機中是十分消耗資源的,即使命令可以很快的執行完畢,頻繁的調用時創建進程消耗十分可觀。
java虛擬機執行這個命令的過程是,首先克隆一條和當前虛擬機擁有一樣環境變數的進程,再用這個新的進程執行外部命令,最後退出這個進程。頻繁的創建對CPU和內存的消耗很大。
下面是一個調用linux命令的例子:
publicclassTest{
publicstaticvoidmain(String[]args)throwsException{
String[]cmds={"/bin/sh","-c","ps-ef|grepjava"};
Processpro=Runtime.getRuntime().exec(cmds);
pro.waitFor();//阻塞,直到上述命令執行完
InputStreamin=pro.getInputStream();
BufferedReaderread=newBufferedReader(newInputStreamReader(in));
Stringline=null;
while((line=read.readLine())!=null){
System.out.println(line);
}
}
}
註:參數中「/bin/sh「 「-c「 是可以用shell執行指定的命令的意思
這里/bin/sh -cps -ef|grep java,會執行ps linux命令
7. Java中可以調用linux下編寫的C可執行程序嗎(如果C程序名稱為:exec) Java代碼如何寫呢
當然可以..java native ..得c配合寫jni..
這個調用一般是三種方式.具體內容..你自己琢磨去
1.jni方式.需要c那端寫jnijava寫介面
2.jna.jni的一個變種.不需要c做過多工作..
ps以上兩條如果寫不好都不穩定
3.process.execute() 說白了就是命令行模式.缺點是進程形式的不可控
4.http方式..這個比較好.就是讓c用cgi寫個web服務.你用java採集.最好用json來做通訊
8. 如何在java程序中調用linux命令或者shell腳本
這里不得不提到java的process類了。
process這個類是一個抽象類,封裝了一個進程(你在調用linux的命令或者shell腳本就是為了執行一個在linux下執行的程序,所以應該使用process類)。
process類提供了執行從進程輸入,執行輸出到進程,等待進程完成,檢查進程的推出狀態,以及shut down掉進程。
至於詳細的process類的介紹放在以後介紹。
另外還要注意一個類:Runtime類,Runtime類是一個與JVM運行時環境有關的類,這個類是Singleton的。
這里用到的Runtime.getRuntime()方法是取得當前JVM的運行環境,也是java中唯一可以得到運行環境的方法。(另外,Runtime的大部分方法都是實例方法,也就是說每次運行調用的時候都需要調用到getRuntime方法)
下面說說Runtime的exec()方法,這里要注意的有一點,就是public Process exec(String [] cmdArray, String [] envp);這個方法中cmdArray是一個執行的命令和參數的字元串數組,數組的第一個元素是要執行的命令往後依次都是命令的參數,envp感覺應該和C中的execve中的環境變數是一樣的,envp中使用的是name=value的方式。
下面說一下,如何使用process來調用shell腳本
例如,我需要在linux下實行linux命令:sh test.sh,下面就是執行test.sh命令的方法:
這個var參數就是日期這個201102包的名字。
String shpath="/test/test.sh"; //程序路徑
Process process =null;
String command1 = 「chmod 777 」 + shpath;
process = Runtime.getRuntime().exec(command1);
process.waitFor();
String var="201102"; //參數
String command2 = 「/bin/sh 」 + shpath + 」 」 + var;
Runtime.getRuntime().exec(command2).waitFor();
注意:
1
我為什麼要使用 chmod 777命令呢?在有的機器上面,可能沒有設置許可權問題。這是你在linux下面執行shell腳本需要注意的問題。沒有的話,就需要添加許可權,就用chmod 777,否則在執行到Runtime.getRuntime().exec的時侯會出現Permission denied錯誤。
2
waitFor()這個也是必不可缺的,如果你需要執行多行命令的話,把waitFor()這個加上。
9. java程序里調用linux命令
1.Java調用shell
Java語言以其跨平台性和簡易性而著稱,在Java裡面的lang包里(java.lang.Runtime)提供了一個允許Java程序與該程序所運
行的環境交互的介面,這就是Runtime類,在Runtime類里提供了獲取當前運行環境的介面。
其中的exec函數返回一個執行shell命令的子進程。exec函數的具體實現形式有以下幾種:
public Process exec(String command) throws IOException
public Process exec(String command,String[] envp) throws
IOException
public Process exec(String command,String[] envp,File dir) throws
IOException
public Process exec(String[] cmdarray) throws IOException
public Process exec(String[] cmdarray, String[] envp) throws
IOException
public Process exec(String[] cmdarray, String[] envp,File dir)
throws IOException
我們在這里主要用到的是第一個和第四個函數,具體方法很簡單,就是在exec函數中傳遞一個代表命令的字元串。exec函數返回的是一個Process類
型的類的實例。Process類主要用來控制進程,獲取進程信息等作用。(具體信息及其用法請參看Java doc)。
1)執行簡單的命令的方法:
代碼如下: