读书人

Eclipse+CDT+MinGW java调用dll或so动

发布时间: 2012-10-10 13:58:11 作者: rapoo

Eclipse+CDT+MinGW java调用dll或so动态库文件(c++/c)

java调用dll或so动态库文件(c++/c)开发平台:Eclipse3.6.1.1+CDT(cdt-master-7.0.0)+MinGW(MinGW-5.0.2)

?

一:在Eclipse中搭建开发C/C++的环境

1:下载并安装cdt :http://www.eclipse.org/cdt/downloads.php? :选择自己eclipse 支持的cdt插件,下载,并且
通过eclipse-->help-->install new software安装cdt

?

二:下载并安装MinGW

1: 下载地址:http://sourceforge.net/project/showfiles.php?group_id=2435
????? 下载并安装? (在线安装的 有点慢!)

2:配置环境变量 (我将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:相关设置
eclipse-->Window->Preferences->C/C++->New CDT project wizard->Makefile Project
找到 Binary Parser 把Elf Parser取消, 选中 PE Windows Parser.
由于在MinGW目录下的make文件名为"mingw32-make.exe", eclipse默认的调用文件名为"make.exe"
所以先将MinGW目录下文件名为"mingw32-make.exe"做个备份,然后将该文件重命名为"make.exe"

?

三:编写一个java类 生成.h头文件

?

package?test;
Eclipse+CDT+MinGW java调用dll或so动态库资料(c++/c)class?Hello
{
????public?native?void?sayHello();
????static
????{
????????System.loadLibrary("hello");
????}
????public?static?void?main(String[]?args)
????{
????????Hello?h?=?new?Hello();
????????h.sayHello();
????}
}

?

在项目的src目录下

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

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

内容如下:

#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

?

四:创建一个C项目? 生成dll文件

?? 创建一个c project 并把test_Hello.h拷进去

1.编写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文件

右键点击项目 make targets--build生成hello.o
?? target name 随便
?? make target 随便
?? 命令默认就可以

3.生成hello.dll文件

?? cmd切换到hello.o目录下

?? 执行命令:gcc -I"D:\DevelopmentSoft\jdk1.6.0_07\include"? -Wl,--add-stdcall-alias -shared -o hello.dll hello.o

? 在该目录下则会生成hello.dll文件

? 备注:若是c++项目 则将gcc 改成g++即可

五:将该hello.dll文件 拷入先前的Hello.java项目中 执行

?

?? 控制台输出:Hello World?!

?

六:备注

1:java调用so(C)
?? java和c / c++通信都可以通过jni来实现。 在java代码中:
?? System.loadLibrary("Hello");
?? Hello不能写成Hello.dll或者Hello.so,它会根据系统平台自动填充,需要注意的是在unix/linux下生成.so动态库文件的时候,
?? 需要在Hello.so前添加lib,否则找不到.so文件(libHello.so),运行的时候需要指定.so的路径:
?? java? -Djava.library.path=/homw/user/so所在目录? -jar? Hello.jar?
??
2:命令整理:
? 以c为例(如果是c++,则把gcc改成g++就OK):
? 1:在unix/linux环境下
? 1.1:生成.o文件
? gcc -I/usr/lib/j2sdk1.5-ibm/include -fPIC -c example.c
? 1.2:生成动态库.so文件
? gcc -shared -WI -soname example.o -o? libexample.so
? 2:在windows环境下
? 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.blogjava.net/orangewhy/archive/2007/05/24/119645.html

?????????????? http://ironurbane.iteye.com/blog/375740

?

以上两个参考地址中 我中和了一下 才能出来!

?

?

?

?

?

?

?

?

?

读书人网 >C++

热点推荐