作者 主題: 如何在C++中去呼叫執行JAVA  (閱讀 13744 次)

0 會員 與 1 訪客 正在閱讀本文。

NARs

  • 活潑的大學生
  • ***
  • 文章數: 227
    • 檢視個人資料
如何在C++中去呼叫執行JAVA
« 於: 2009-12-17 11:51 »
各位大大~
有人試過在C中去呼叫執行JAVA嗎?如果helloworld編譯出的執行檔,請問要如何在C中去執行???
代碼: [選擇]

public class HelloWorld {



    public static void main(String[] args) {

        System.out.println("Hello, World in Java");

    }



}

Yamaka

  • 俺是博士!
  • *****
  • 文章數: 4913
    • 檢視個人資料
    • http://www.ecmagic.com
回覆: 如何在C++中去呼叫執行JAVA
« 回覆 #1 於: 2009-12-17 12:28 »
各位大大~
有人試過在C中去呼叫執行JAVA嗎?如果helloworld編譯出的執行檔,請問要如何在C中去執行???
代碼: [選擇]
public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, World in Java");
    }
}

用 exec() 就可以吧  :D

mmjanjust

  • 可愛的小學生
  • *
  • 文章數: 2
    • 檢視個人資料
回覆: 如何在C++中去呼叫執行JAVA
« 回覆 #2 於: 2009-12-17 12:36 »
那是直接把JAVA編譯出的class檔,copy到C專案下,在使用exec去呼叫執行就可以了嗎?
但是我使用exec去執行編譯出DLL檔時,

代碼: [選擇]
exec("hello.class");
卻出現錯誤
代碼: [選擇]
error C3861: 'exec': identifier not found
« 上次編輯: 2009-12-17 13:11 由 mmjanjust »

kenduest

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 3675
    • 檢視個人資料
    • http://kenduest.sayya.org
回覆: 如何在C++中去呼叫執行JAVA
« 回覆 #3 於: 2009-12-17 13:35 »

請先查一下函數使用說明

代碼: [選擇]
EXEC(3)                          Linux Programmer's Manual                          EXEC(3)

NAME
       execl, execlp, execle, execv, execvp - execute a file

SYNOPSIS
       #include <unistd.h>

       extern char **environ;

       int execl(const char *path, const char *arg, ...);
       int execlp(const char *file, const char *arg, ...);
       int execle(const char *path, const char *arg,
                  ..., char * const envp[]);
       int execv(const char *path, char *const argv[]);
       int execvp(const char *file, char *const argv[]);

linux 下你可以 man 3 exec,用 vc 等這類請查 msdn。
I am kenduest - 小州

my website: http://kenduest.sayya.org/

NARs

  • 活潑的大學生
  • ***
  • 文章數: 227
    • 檢視個人資料
回覆: 如何在C++中去呼叫執行JAVA
« 回覆 #4 於: 2009-12-17 13:50 »
是這樣嗎?還要include什麼嗎?

代碼: [選擇]
execl("C:\JAVA\bin\java","hello.class","");
因為我在編譯DLL檔時,還是會哭說:
'execl': identifier not found


可以使用system的方式嗎?
試過使用system("hello.class");
是可以編譯成功,但是在執行時卻沒有執行到java那支class檔

kenduest

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 3675
    • 檢視個人資料
    • http://kenduest.sayya.org
回覆: 如何在C++中去呼叫執行JAVA
« 回覆 #5 於: 2009-12-17 14:01 »
是這樣嗎?還要include什麼嗎?

你應該去查 msn 的,不是都有寫嗎?

引用

代碼: [選擇]
execl("C:\JAVA\bin\java","hello.class","");

你都不看文件查詢函數原型,所以連基本的引數都使用錯誤咧。

還有 c/c++ 內?你用 \JAVA\ 這個 "\" 你應該要知道那是跳脫字元,所以要.. ?

引用
可以使用system的方式嗎?
試過使用system("hello.class");
是可以編譯成功,但是在執行時卻沒有執行到java那支class檔

hello.class 是執行檔嗎?您的 java 程式只要輸入執行 hello.class 就可以執行?
I am kenduest - 小州

my website: http://kenduest.sayya.org/

NARs

  • 活潑的大學生
  • ***
  • 文章數: 227
    • 檢視個人資料
回覆: 如何在C++中去呼叫執行JAVA
« 回覆 #6 於: 2009-12-17 15:04 »
用commandline的方式執行的話
java hello , 就可以執行成功
但是在C中,用system("java hello");
可以編譯成功,但是卻沒有執行java

kenduest

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 3675
    • 檢視個人資料
    • http://kenduest.sayya.org
回覆: 如何在C++中去呼叫執行JAVA
« 回覆 #7 於: 2009-12-17 15:27 »
用commandline的方式執行的話
java hello , 就可以執行成功
但是在C中,用system("java hello");
可以編譯成功,但是卻沒有執行java

怎樣判斷是否有執行的?你開一個命令提示字元跑你的 c 程式,system() 函數執行出現啥訊息?

I am kenduest - 小州

my website: http://kenduest.sayya.org/

kenduest

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 3675
    • 檢視個人資料
    • http://kenduest.sayya.org
回覆: 如何在C++中去呼叫執行JAVA
« 回覆 #8 於: 2009-12-17 16:09 »

你誤解我的意思了....

至少你也看一下你跑 system() 函數時候的輸出。比方你程式顯示一些訊息,然後確認用 system() 執行時候,透過訊息輸出可以確認有執行到該程式。

所以我說請你用命令提示字元跑你的 c 程式,至少跑 system() 呼叫時候,至少有看到你寫的輸出訊息,可以確認有執行到。
I am kenduest - 小州

my website: http://kenduest.sayya.org/

NARs

  • 活潑的大學生
  • ***
  • 文章數: 227
    • 檢視個人資料
回覆: 如何在C++中去呼叫執行JAVA
« 回覆 #9 於: 2009-12-17 19:16 »
Google找了一下,是不是要透過JNI的方式,才能在C++中去執行JAVA class檔?

elleryq

  • 區域板主
  • 鑽研的研究生
  • *****
  • 文章數: 908
  • 性別: 男
    • 檢視個人資料
    • Thinking more...
回覆: 如何在C++中去呼叫執行JAVA
« 回覆 #10 於: 2009-12-18 09:27 »

請參考這篇:Embed Java VM in Executables using Java Native Interface (JNI) — CodeGuru.com

我用的關鍵字:embed java in c++ program
Plan your work, then work your plan.
我的首頁:http://blog.elleryq.idv.tw
351899by http://counter.li.org

kenduest

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 3675
    • 檢視個人資料
    • http://kenduest.sayya.org
回覆: 如何在C++中去呼叫執行JAVA
« 回覆 #11 於: 2009-12-18 18:22 »

這個似乎扯太遠了,連 JNI 都搬出來呢.....

JNI 的應用是另外一個領域的,若你只是要用 c/c++ 單純呼叫 java 來執行某個 class 檔案並沒有特殊地方。問題就是出在您似乎連 system() 的使用有問題,也沒進行基本的診斷。您要使用 execl() 等函數也可以,也是要使用正確呼叫方式。前面一看你函數呼叫根本用法就不對,那怎麼能夠執行?

1. system("hello.class");

上面用法,莫非你系統神奇到只要輸入 hello.class 就可以執行?若你都知道用 java hello 可以執行,那為何這邊你這樣使用?

2. system("java hello");

剛方式確定當時候你的 path 環境變數可以找到 java 程式嗎?還有當時候你啟動所在目錄在哪?可以找到 hello.java 檔案?

若你認為有問題,至少你單純跑 java 後看一下輸出吧,有看到訊息表示 system 函數可以找到你 java 該命令執行,後續再談 hello 傳入這個引數才有意義。而這也是你認為有問題時候應該學會除錯的方式。

3. execl("C:\JAVA\bin\java","hello.class","");

請問你傳入第 2,3 個引數根本不對,還有 \ 是跳脫字元,所以路徑這樣程式找不到的。你應該好好認真查 manpage or MSDN 文件的。

一些問題是基本的函數呼叫沒模糊而不清楚,若還把 JNI 搬出來無疑雪上加霜更多問題。
I am kenduest - 小州

my website: http://kenduest.sayya.org/

NARs

  • 活潑的大學生
  • ***
  • 文章數: 227
    • 檢視個人資料
回覆: 如何在C++中去呼叫執行JAVA
« 回覆 #12 於: 2009-12-23 09:50 »
kenduest大大:
我把hello.class複製到和執行C的程式在同一個目錄下(H:\Program_C\hello\hello),在命令提示字元下,也在H:\Program_C\hello\hello目錄下執行java hello,
是可以成功執行的。
但是當我在C中加入
system("java  hello") ;
卻無法執行 ??

請問你說在命令提示字元下執行C,我是個新手,請問要如何在命令提示字元下執行C的.cpp?
« 上次編輯: 2009-12-23 13:54 由 NARs »

kenduest

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 3675
    • 檢視個人資料
    • http://kenduest.sayya.org
回覆: 如何在C++中去呼叫執行JAVA
« 回覆 #13 於: 2009-12-23 15:09 »


請開啟命令提示字元後,去實際的目錄位置找到你程式檔案後輸入你程式檔案命令執行測試即可。

I am kenduest - 小州

my website: http://kenduest.sayya.org/

NARs

  • 活潑的大學生
  • ***
  • 文章數: 227
    • 檢視個人資料
回覆: 如何在C++中去呼叫執行JAVA
« 回覆 #14 於: 2009-12-24 13:24 »
kenduest大大:
在命令提示字元中執行所編譯的dll檔時,並沒有出現錯誤訊息

kenduest

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 3675
    • 檢視個人資料
    • http://kenduest.sayya.org
回覆: 如何在C++中去呼叫執行JAVA
« 回覆 #15 於: 2009-12-24 18:00 »

您需求是使用 c/c++ 透過 system() 函數去呼叫 java 命令執行你的 java class 檔案咧,現在還跑出 dll 檔案?

你好像搞錯方向了? 一個說東一個說西?
I am kenduest - 小州

my website: http://kenduest.sayya.org/

NARs

  • 活潑的大學生
  • ***
  • 文章數: 227
    • 檢視個人資料
回覆: 如何在C++中去呼叫執行JAVA
« 回覆 #16 於: 2009-12-24 18:05 »
解決了~感謝大大!!
« 上次編輯: 2009-12-24 18:18 由 NARs »

kenduest

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 3675
    • 檢視個人資料
    • http://kenduest.sayya.org
回覆: 如何在C++中去呼叫執行JAVA
« 回覆 #17 於: 2009-12-24 18:16 »

那是兩回事好嗎?你怎麼把兩個不相干的東西混在一起討論?

你一直都沒走前面說的測試方式,請你把基本的 system() 呼叫使用討論清楚,不要節外生枝。

你得一定要他人把整個流程丟給你才可以嗎?

代碼: [選擇]
SayyaBBS:kendlee@~/tmp/test> ls -l
總計 8
-rw-rw-r-- 1 kendlee kendlee 131 2009-12-24 18:12 HelloWorld.java
-rw-rw-r-- 1 kendlee kendlee  97 2009-12-24 18:11 dotest.c

代碼: [選擇]
SayyaBBS:kendlee@~/tmp/test> java -version
java version "1.5.0_21"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_21-b01)
Java HotSpot(TM) Client VM (build 1.5.0_21-b01, mixed mode)

代碼: [選擇]
SayyaBBS:kendlee@~/tmp/test> cat HelloWorld.java
public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, World in Java");
    }
}

代碼: [選擇]
SayyaBBS:kendlee@~/tmp/test> cat dotest.c
#include <unistd.h>
#include <stdlib.h>

int main()
{
  system("java HelloWorld");
  return 0;
}


代碼: [選擇]
SayyaBBS:kendlee@~/tmp/test> gcc -o dotest dotest.c
SayyaBBS:kendlee@~/tmp/test>
SayyaBBS:kendlee@~/tmp/test> javac HelloWorld.java
SayyaBBS:kendlee@~/tmp/test>
SayyaBBS:kendlee@~/tmp/test> java HelloWorld
Hello, World in Java
SayyaBBS:kendlee@~/tmp/test>
SayyaBBS:kendlee@~/tmp/test> ./dotest
Hello, World in Java

I am kenduest - 小州

my website: http://kenduest.sayya.org/

kenduest

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 3675
    • 檢視個人資料
    • http://kenduest.sayya.org
回覆: 如何在C++中去呼叫執行JAVA
« 回覆 #18 於: 2009-12-24 18:25 »

哪有人修改前面 post 文章說,解決了?

1. 討論問題,文章參與不是這樣方式進行的。

2. 不要只丟一個解決了然後沒說清楚問題點。

I am kenduest - 小州

my website: http://kenduest.sayya.org/

NARs

  • 活潑的大學生
  • ***
  • 文章數: 227
    • 檢視個人資料
回覆: 如何在C++中去呼叫執行JAVA
« 回覆 #19 於: 2009-12-24 18:29 »
對不起喔~~~kenduest!!
因為剛回覆完你的問題後,就發現了錯誤點了!!!!所以回覆"已解決",免得浪費你的時間@@@@
真的非~~~常~~~感謝你的回覆!!!!! ^^