电竞比分网-中国电竞赛事及体育赛事平台

分享

Eclipse CDT MinGW java調(diào)用dll或so動(dòng)態(tài)庫(kù)文件(c /c)

 南郡修道院 2012-02-15

java調(diào)用dll或so動(dòng)態(tài)庫(kù)文件(c++/c)開(kāi)發(fā)平臺(tái):Eclipse3.6.1.1+CDT(cdt-master-7.0.0)+MinGW(MinGW-5.0.2)

 

一:在Eclipse中搭建開(kāi)發(fā)C/C++的環(huán)境

1:下載并安裝cdt :http://www./cdt/downloads.php  :選擇自己eclipse 支持的cdt插件,下載,并且
通過(guò)eclipse-->help-->install new software安裝cdt

 

二:下載并安裝MinGW

1: 下載地址:http:///project/showfiles.php?group_id=2435
      下載并安裝  (在線安裝的 有點(diǎn)慢!)

2:配置環(huán)境變量 (我將MinGW安裝在C:\MinGW)

     PATH:    C:\MinGW\bin  
     C_INCLUDE_PATH:  C:\MinGW\include
     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
     LIBRARY_PATH:   C:\MinGW\lib

3:相關(guān)設(shè)置
eclipse-->Window->Preferences->C/C++->New CDT project wizard->Makefile Project
找到 Binary Parser 把Elf Parser取消, 選中 PE Windows Parser.
由于在MinGW目錄下的make文件名為"mingw32-make.exe", eclipse默認(rèn)的調(diào)用文件名為"make.exe"
所以先將MinGW目錄下文件名為"mingw32-make.exe"做個(gè)備份,然后將該文件重命名為"make.exe"

 

三:編寫(xiě)一個(gè)java類 生成.h頭文件

 

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

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

}

 

在項(xiàng)目的src目錄下

用命令 javac test/Hello.java 生成 Hello.class文件

          javah -jni test.Hello 生成 test_Hello.h文件

內(nèi)容如下:

#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

 

四:創(chuàng)建一個(gè)C項(xiàng)目  生成dll文件

   創(chuàng)建一個(gè)c project 并把test_Hello.h拷進(jìn)去

1.編寫(xiě)C類:hello.c

 

#include <jni.h>
#include "test_Hello.h"
#include <stdio.h>

int main(void) {
 return 0;
}
JNIEXPORT void JNICALL Java_test_Hello_sayHello(JNIEnv *env, jobject obj) {
   printf("Hello World !\n");
   return;
}

 

2.生成hello.o文件

右鍵點(diǎn)擊項(xiàng)目 make targets--build生成hello.o
   target name 隨便
   make target 隨便
   命令默認(rèn)就可以

3.生成hello.dll文件

   cmd切換到hello.o目錄下

   執(zhí)行命令:gcc -I"D:\DevelopmentSoft\jdk1.6.0_07\include"  -Wl,--add-stdcall-alias -shared -o hello.dll hello.o

  在該目錄下則會(huì)生成hello.dll文件

  備注:若是c++項(xiàng)目 則將gcc 改成g++即可

五:將該hello.dll文件 拷入先前的Hello.java項(xiàng)目中 執(zhí)行

 

   控制臺(tái)輸出:Hello World !

 

六:備注

1:java調(diào)用so(C)
   java和c / c++通信都可以通過(guò)jni來(lái)實(shí)現(xiàn)。 在java代碼中:
   System.loadLibrary("Hello");
   Hello不能寫(xiě)成Hello.dll或者Hello.so,它會(huì)根據(jù)系統(tǒng)平臺(tái)自動(dòng)填充,需要注意的是在unix/linux下生成.so動(dòng)態(tài)庫(kù)文件的時(shí)候,
   需要在Hello.so前添加lib,否則找不到.so文件(libHello.so),運(yùn)行的時(shí)候需要指定.so的路徑:
   java  -Djava.library.path=/homw/user/so所在目錄  -jar  Hello.jar 
  
2:命令整理:
  以c為例(如果是c++,則把gcc改成g++就OK):
  1:在unix/linux環(huán)境下
  1.1:生成.o文件
  gcc -I/usr/lib/j2sdk1.5-ibm/include -fPIC -c example.c
  1.2:生成動(dòng)態(tài)庫(kù).so文件
  gcc -shared -WI -soname example.o -o  libexample.so
  2:在windows環(huán)境下
  2.1:生成.o文件
  gcc -c -I"D:\Program Files\Java\jdk1.6.0_10\include" -I"D:\Program Files\Java\jdk1.6.0_10\include\win32" -o Hello.o Hello.c
  2.2:生成dll文件
  gcc -I"D:\Program Files\Java\jdk1.6.0_10\include" -Wl,--add-stdcall-alias -shared -o Hello.dll Hello.o

 

 

 

參考地址:http://www./orangewhy/archive/2007/05/24/119645.html

               http://ironurbane./blog/375740

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多