您的位置:首页 > 编程语言 > C语言/C++

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

2013-08-29 14:33 459 查看
今天偶然看到了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


 #include <</span>stdlib.h>


#include <</span>iostream>


using namespace std;


extern "C"


{


    typedef void (*OpenFunc)(const char*,int);




    OpenFunc openfunc = NULL;




    void init(OpenFunc func) {


        cout << "init called" <<endl;


        openfunc = func;


    }




    void test() {


        if (openfunc == NULL) {


            cout << "openfunc is NULL" << endl;


        }


        (*openfunc)("test", 0);


    }


}



 

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

 3、Java代码

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

 


package clibtest;




import com.sun.jna.Callback;


import com.sun.jna.Library;






public interface CLib extends Library{




    public interface OpenFunc extends Callback {


        void invoke(String filename, int i);


    }


    void init(OpenFunc openfunc);


    void test();


}





 


package clibtest;




import com.sun.jna.Native;




public class hello {




    public static void main(String[] args) {


        // Loading dynamically the library


        CLib lib = (CLib) Native.loadLibrary("libJNALib", CLib.class);




        lib.init(new CLib.OpenFunc() {




            public void invoke(String filename, int i) {


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


                System.out.println(filename);


            }


        });




        lib.test();


    }


}





 

4、项目结构如下



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



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


 
   
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: