bigbear

          JNA實現(xiàn)Java調(diào)用C++動態(tài)鏈接庫

          今天偶然看到了JNA的介紹,下載下來試了一下,很好用,相比較JNI要簡單很多。做了一個可以callback的c++動態(tài)鏈接庫,實現(xiàn)了java和c++的互相調(diào)用。

           1、開發(fā)環(huán)境:

           開發(fā)工具:Netbeans 6.8,包含了Java和C++開發(fā)插件,用一個工具比較方便,可以同時開發(fā)C++的dll和Java代碼。

          C++環(huán)境:MingW 5.1.6+MSYS、g++ 3.4.5

          Java環(huán)境:JDK 1.6.0_18

           2、C++代碼

           用Netbeans創(chuàng)建一個動態(tài)鏈接庫項目JNALib,創(chuàng)建一個c++源文件clib.cpp,生成結(jié)果為libJNALib.dll

           #include <stdlib.h>
          #include 
          <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聲明了一個回調(diào)類型,也就是一個函數(shù)指針,可以通過init將java中的OpenFunc方法傳遞進來,設(shè)置這個函數(shù)指針,如此一來,可以實現(xiàn)C++到Java的回調(diào)。

           3、Java代碼

           創(chuàng)建一個Java項目JNADemo,創(chuàng)建一個包clibtest,創(chuàng)建以下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、項目結(jié)構(gòu)如下



          5、編譯C++項目,生成libJNALib.dll,拷貝到JNADemo主目錄,目錄結(jié)構(gòu)如下:

          6、運行程序,結(jié)果如下:

          posted on 2010-05-11 10:51 大熊 閱讀(4691) 評論(1)  編輯  收藏

          Feedback

          # re: JNA實現(xiàn)Java調(diào)用C++動態(tài)鏈接庫 2013-09-12 14:11 水電費

          (*openfunc)("test",o);
          這個o木有定義啊  回復(fù)  更多評論   


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 舞阳县| 鄢陵县| 宁津县| 视频| 亚东县| 嘉祥县| 栾城县| 田阳县| 合阳县| 勃利县| 金溪县| 灵璧县| 上饶市| 葫芦岛市| 普兰店市| 永济市| 高邑县| 千阳县| 阿坝县| 驻马店市| 宜阳县| 阿巴嘎旗| 洛隆县| 天门市| 北京市| 措美县| 宝山区| 九寨沟县| 凤台县| 吉隆县| 万荣县| 崇仁县| 永胜县| 晋城| 闸北区| 淮南市| 会昌县| 津市市| 茂名市| 玉溪市| 禄丰县|