[JNI] Eclipse直接完成JAVA調用C/C++ (Eclipse上使用CDT結合MinGW)

 

http://www.blogjava.net/orangewhy/archive/2007/05/24/119645.html

網上都有很多在windows平臺下JAVA調用C/C++方法的介紹說明。但是,在此過程中,絕大多數都是利用VC等其他工具來進行DLL的生成。試想一下,在eclipse平臺開發了JAVA,突然又要打開VC的工作環境,多不爽!何況如果內存不夠的話,還得先把其中一個退出。到需要再重新打開,多費勁啊!!現在,我們讓這一系列的工作都在eclipse上完成!

 

首先、安裝eclipse3.2。

這個安裝過程我就不在這裏介紹了,大家都懂。

 

第二、安裝MinGW。

1.用戶可以直接登陸以下地址下載MinGW http://prdownloads.sourceforge.net/mingw/MinGW-5.0.3.exe

2. 鼠標雙擊執行安裝文件,選擇“Download and Install”,下一步

3.選擇軟件安裝的版本,這裏我們選擇“Candidate”,下一步

4.選擇安裝的編譯器

   1) g++ compiler

   2) g77 compiler

   3) Objective C Compiler

   4) MinGW Make

   下一步

5. 選擇安裝路徑,下一步

   這裏用默認路徑C:\MinGW

6.  等待下載軟件版本及安裝。安裝會自動完成,但是你要保證你的網絡是可用的。

 

第三、MinGW的環境變量設置

1. 系統變量裏面的Path添加“MinGW安裝目錄\bin;(例如;C:\MinGW\bin;)

2. 系統變量裏添加 C_INCLUDE_PATH,值爲:C:\MinGW\include

3. 系統變量裏添加 CPLUS_INCLUDE_PATH,值爲:C:\MinGW\include\c++\3.4.2;C:\MinGW\include\c++\3.4.2\mingw32;C:\MinGW\include\c++\3.4.2\backward;C:\MinGW\include     (這裏要注意你的版本號哦)

 

第四、做一個小技巧修改

   先將MinGW安裝目錄\bin底下的 mingw32-make.exe複製一份副本,將副本更名爲make.exe (因爲eclipse默認用了make,不是mingw32-make,當然,你也可以修改eclipse的設定,自己喜歡吧)。

 

第五、安裝CDT插件。

1、Eclipse的網站上面找到CDT插件的壓縮包,然後下載至電腦硬盤上;

  下載地址:(http://www.eclipse.org/cdt/downloads.php )

2、就像你安裝其他安裝插件一下的方式安裝CDT插件吧。怎麼安裝不是關鍵問題,按你喜歡,能用就可以了。

 

第六、簡單介紹CDT的使用吧。

1.  新建一個C++項目點擊菜單欄上的 File / New / Standard Make C++ Project

   如果想建立一個C項目則選擇Standard Make C Project;

2.  輸入New Project名字,直接按Finish完成Project添加

3. 給項目新建一個的源文件,點擊菜單欄上的 File / New / File

4. 接着出現文件添加的窗口,在File Name欄裏面寫上文件名

  C++的源文件後綴名爲cpphello.cpp

  C的源文件後綴名爲chello.c

5.

編輯剛剛添加的hello.cpp文件,添加一段C++的代碼,內容如下:

#include <iostream>
using namespace std;  
  
int main()  
{  
    cout
<<"hello world!!\n";  
    
return 1;
}
 

若你新建的項目爲C的話,則需添加相應的C代碼,內容如下:

#include "stdio.h"
int main(){
   printf(
"Hello world!\n");
   
return 1;
}

添加一個編譯命令

Target Name:MAKE FILE

Builder Command:g++ hello.cpp -g -o run

這裏如果是c環境就改成gcc hello.c -g -o run

雙擊MAKE FILE,此時Eclipse在項目文件的根目錄創建一個run.exe的文件,此文件根據hello.cpp代碼編譯生成。

雙擊run.exe可以預覽效果,控制檯輸出結果:Hello world!

第七、讓我們開始進入真正的工作吧!

The Java side

1.建立Java工程JavaHello,編寫java

// Hello.class,這裏主要包名,因爲後面的函數命名同包名也有聯繫的。

package test;
class Hello
{
    
public native void sayHello();
    
static
    
{
        System.loadLibrary(
"hello");
    }

    
public static void main(String[] args)
    
{
        Hello h 
= new Hello();
        h.sayHello();
    }

}

 

2.用命令生成頭文件

bin目錄下建立批處理文件,名稱隨意,用bat作爲擴展名就行了。這裏命名爲run.bat

內容爲:

set java_home=F:\dev-software\dev-soft\jdk\jdk1.5.0
set path
=%java_home%\bin
set class_path
=%java_home%\lib;%java_home%\lib\dt.jar;%java_home%\lib\tools.jar
javah 
-jni test.Hello
@pause

保存,執行(可以雙擊執行,也可在eclipse的“Run As”調用bat批處理文件來執行),則在bin目錄下生成test_Hello.h文件。內容爲:

/**//* DO NOT EDIT THIS FILE - it is machine generated */
#include 
<jni.h>
/**//* Header for class test_Hello */

#ifndef _Included_test_Hello
#define _Included_test_Hello
#ifdef __cplusplus
extern "C" {
#endif
/**//*
 * Class:     test_Hello
 * Method:    sayHello
 * Signature: ()V
 
*/

JNIEXPORT 
void JNICALL Java_test_Hello_sayHello
  (JNIEnv 
*, jobject);

#ifdef __cplusplus
}

#endif
#endif

The C sideCompiling the Library

1.建立標準C工程Cpro,並生成dll文件

1將生成的頭文件test_Hello.h拷貝到C工程Cpro

2編寫CHello.c,內容爲:

#include <jni.h>
#include 
"test_Hello.h"
#include 
<stdio.h>
JNIEXPORT 
void JNICALL Java_test_Hello_sayHello
(JNIEnv 
*env, jobject obj)
{
printf(
"Hello world !\n");
return;
}

3C工程Cpro下建立hello.def文件(用於定義導出的函數),內容爲:

EXPORTS
Java_test_Hello_sayHello

4)在C工程Cpro下建立makefile文件,內容爲:

step1:
    gcc 
--I"F:\dev-software\dev-soft\jdk\jdk1.5.0\include" -I"F:\dev-software\dev-soft\jdk\jdk1.5.0\include\win32" -o hello.o Hello.c
step2:
    gcc 
-shared -o hello.dll hello.o hello.def

5)Make Targets視圖下,爲Cpro工程添加兩個Make Target(對應makefile文件的內容),如下圖:

6Make Targets視圖下雙擊step1,在C工程Cpro生成hello.o文件。

7) Make Targets視圖下雙擊step1,在C工程Cpro生成hello.dll文件。

JAVA調用DLL

1. hello.dll拷貝到Java工程JavaHello下。

2. 運行Hello.java,則可以看到輸出結果:

Hello world!

 

注:如果上面不是C工程而是是C++工程

1Hello.c改爲Hello.cpp

2makefile內容改爲:

 

step1:
    g
++  --I"F:\dev-software\dev-soft\jdk\jdk1.5.0\include" -I"F:\dev-software\dev-soft\jdk\jdk1.5.0\include\win32" -o hello.o Hello.cpp
    
step2:
    g
++ -shared -o hello.dll hello.o hello.def
3)其他的幾乎都不用改變也可以。

posted on 2007-05-24
發佈了1 篇原創文章 · 獲贊 3 · 訪問量 3797
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章