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