java调用动态链接库_JNA实现Java调用C++动态链接库

今天偶然看到了JNA的介绍,下载下来试了一下,很好用,相比较JNI要简单很多。做了一个可以callback的c++动态链接库,实现了java和c++的互相调用。

1、开发环境:

开发工具:Netbeans 6.8,包含了Java和C++开发插件,用一个工具比较方便,可以同时开发C++的dll和Java代码。

C++环境:MingW 5.1.6+MSYS、g++ 3.4.5

Java环境:JDK 1.6.0_18

2、C++代码

用Netbeans创建一个动态链接库项目JNALib,创建一个c++源文件clib.cpp,生成结果为libJNALib.dll

4f1150b881333f12a311ae9ef34da474.png#include4f1150b881333f12a311ae9ef34da474.png#include4f1150b881333f12a311ae9ef34da474.pngusingnamespacestd;

4f1150b881333f12a311ae9ef34da474.pngextern"C"1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gif9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png    typedefvoid(*OpenFunc)(constchar*,int);

d18c02628675d0a2c816449d98bda930.png

d18c02628675d0a2c816449d98bda930.png    OpenFunc openfunc=NULL;

d18c02628675d0a2c816449d98bda930.png

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifvoidinit(OpenFunc func)9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png        cout<

d18c02628675d0a2c816449d98bda930.png        openfunc=func;

ecedf933ec37d714bd4c2545da43add2.png    }d18c02628675d0a2c816449d98bda930.png

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifvoidtest()9b8a8a44dd1c74ae49c20a7cd451974e.png{

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifif(openfunc==NULL)9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png            cout<

ecedf933ec37d714bd4c2545da43add2.png        }d18c02628675d0a2c816449d98bda930.png        (*openfunc)("test",0);

ecedf933ec37d714bd4c2545da43add2.png    }8f1ba5b45633e9678d1db480c16cae3f.png}4f1150b881333f12a311ae9ef34da474.png

注意:其中OpenFunc声明了一个回调类型,也就是一个函数指针,可以通过init将java中的OpenFunc方法传递进来,设置这个函数指针,如此一来,可以实现C++到Java的回调。

3、Java代码

创建一个Java项目JNADemo,创建一个包clibtest,创建以下java代码:

4f1150b881333f12a311ae9ef34da474.pngpackageclibtest;

4f1150b881333f12a311ae9ef34da474.png

4f1150b881333f12a311ae9ef34da474.pngimportcom.sun.jna.Callback;

4f1150b881333f12a311ae9ef34da474.pngimportcom.sun.jna.Library;

4f1150b881333f12a311ae9ef34da474.png

4f1150b881333f12a311ae9ef34da474.png

1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gifpublicinterfaceCLibextendsLibrary9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifpublicinterfaceOpenFuncextendsCallback9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.pngvoidinvoke(String filename,inti);

ecedf933ec37d714bd4c2545da43add2.png    }d18c02628675d0a2c816449d98bda930.pngvoidinit(OpenFunc openfunc);

d18c02628675d0a2c816449d98bda930.pngvoidtest();

8f1ba5b45633e9678d1db480c16cae3f.png}4f1150b881333f12a311ae9ef34da474.png

4f1150b881333f12a311ae9ef34da474.png

4f1150b881333f12a311ae9ef34da474.pngpackageclibtest;

4f1150b881333f12a311ae9ef34da474.png

4f1150b881333f12a311ae9ef34da474.pngimportcom.sun.jna.Native;

4f1150b881333f12a311ae9ef34da474.png

1fa987a29c6482f53d401256f96355eb.png

ca75c07623e1b494fee67e8f316fc310.gifpublicclasshello9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifpublicstaticvoidmain(String[] args)9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png//Loading dynamically the libraryd18c02628675d0a2c816449d98bda930.pngCLib lib=(CLib) Native.loadLibrary("libJNALib", CLib.class);

d18c02628675d0a2c816449d98bda930.png

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gif        lib.init(newCLib.OpenFunc()9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png

97e794c86028c5f5b5461ae5ef440a4c.png

3c6cafce68eb941a00f1998f1d3d3aa6.gifpublicvoidinvoke(String filename,inti)9b8a8a44dd1c74ae49c20a7cd451974e.png{

d18c02628675d0a2c816449d98bda930.png                System.out.println("callback called.");

d18c02628675d0a2c816449d98bda930.png                System.out.println(filename);

ecedf933ec37d714bd4c2545da43add2.png            }ecedf933ec37d714bd4c2545da43add2.png        });

d18c02628675d0a2c816449d98bda930.png

d18c02628675d0a2c816449d98bda930.png        lib.test();

ecedf933ec37d714bd4c2545da43add2.png    }8f1ba5b45633e9678d1db480c16cae3f.png}4f1150b881333f12a311ae9ef34da474.png

4f1150b881333f12a311ae9ef34da474.png

4、项目结构如下

d02d1815becd52457c22c11ec3802818.png

5、编译C++项目,生成libJNALib.dll,拷贝到JNADemo主目录,目录结构如下:

7f87eaa769147b1ec409345292aef8de.png

6、运行程序,结果如下:

02b94398133765fa281fb26917a340da.png

posted on 2010-05-11 10:51 大熊 阅读(4430) 评论(1)  编辑  收藏

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值