運行環境
Windows10 專業版 64位
JDK 1.8.0.121 64位
Eclipse Jee Neon
Visual Studio 2015 專業版
Swigwin3.0.12
先從Swig官網下載下最新版 Swig windows版,解壓到任意目錄.
我是解壓在 D:/sdk/swigwin-3.0.12
設置環境變量 SWIG_HOME = D:/sdk/swigwin-3.0.12
PATH里多加個 %SWIG_HOME%
使我們在任意目錄都能方便使用swig.exe
java 程序為 webapp,與控制臺程序略有不同,網上例子大多為控制臺程序調用C++動態庫.使我一開始走了很多彎路.控制臺的例子網上很多這里就不寫了.
先上CPP代碼:
在VS2015里創建控制臺空項目,之所以要空項目,是省得到VS自動給你生成沒用的 main函數,到時要刪很煩.
在項目里新增類 SwigDemoToJava
SwigDemoToJava.h
/*SwigDemoToJava.h*/#PRagma onceclass SwigDemoToJava{public: int SwigAdd(int i, int j);};SwigDemoToJava.cpp#include "SwigDemoToJava.h"int SwigDemoToJava::SwigAdd(int i, int j){ return i + j;}很簡單的一個類,測試用就實現一個整數加法.然后在項目里新增Swig接口文件
SwigDemo.i
%module SwigDemo%{#include "SwigDemoToJava.h"%}%include "SwigDemoToJava.h"這里解釋一下,%module ,模塊名 ,不能和C++類名相同,
Win+R運行 cmd.exe打開命令窗口
進入到 C++項目所在源代碼目錄,(此時swigdemo.i也應在此)
運行: Swig -c++ -java -package com.myjavaproject.library -ourdir "e:/javaspace/myjavaproject/src/main/java/com/myjavaproject/library" swigdemo.i
當然,你也可以不指定 -outdir,
如果不指定-outdir,會在當前目錄下生成4個文件 1個SwigDemo_wrap.cxx 和三個.java文件,手動把三個java文件copy到你的java項目中去.
在VS里把swigDemo_wrap.cxx加入到工程,然后重新編譯,生成swigdemo.dll
把生成的dll復制到 java.library.path里列出來的任意目錄..這里有點區別,在控制臺java程序中java.library.path中列出的任意目錄都可以放dll,JAVA程序都能調用到dll
但是如果是webApp,把DLL放在有些目錄就不能調用.比如我之前把dll放在C:/Program Files/Java/jre1.8.0_121/bin/server 下(該目錄也是 library.path)
控制臺程序可以正常調用DLL,而webApp則能loadlibrary,但一new對像就異常.
我個人猜測,可能是控制臺APP直接創建新JVM線程,而webApp依靠于Tomcat的原因,具體什么原因不明,以后有空再研究了.
轉回正題.編寫JAVA程序.
我原來有個JAVA項目,項目名我這里暫時用myjavaproject代替.
為了簡單,我直接在控制器里調用C++動態庫了,
直接代碼:
package com.myjavaproject.controller;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.ResponseBody;import com.myjavaproject.controller.BaseController;import com.myjavaproject.library.SwigDemoToJava;;@Controller@RequestMapping("/NativeDemo")public class NativeDemoController extends BaseController { @RequestMapping("/demo1.do") @ResponseBody public String demo1(String param1,String param2) { try { System.loadLibrary("SwigDemo"); SwigDemoToJava sd1 = new SwigDemoToJava(); return "SwigDemo is:" +String.valueOf(sd1.SwigAdd(Integer.parseInt(param1),Integer.parseInt(param2))); } catch (Exception e) { return e.getMessage(); } }}保存,運行在瀏覽器里輸入http://localhost:8080/myjavaproject/NativeDemo/demo1.do?param1=11¶m2=22
返回:
SwigDemo is:33
成功調用C++動態庫里的SwigAdd成員函數.
注意事項:
1.Swig接口文件里%module 模塊名,不能同C++類名一樣
2.在WebApp里,不是所有的library path都能放動態庫.我最后是把DLL直接放在C:/Windows/System32 下面,下次有空再研究一下怎么放在WebApp指定目錄....
3.在swig命令里最好指定package.并放到項目的相應目錄下.
4.還沒想到....
最后留下此筆記,以備未來哪天忘記了方便查閱
新聞熱點
疑難解答
圖片精選