国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

通過Swig封裝JAVA Native Interface調用C++動態庫

2019-11-08 19:46:49
字體:
來源:轉載
供稿:網友

運行環境

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&param2=22

返回:

SwigDemo is:33

成功調用C++動態庫里的SwigAdd成員函數.

注意事項:

1.Swig接口文件里%module 模塊名,不能同C++類名一樣

2.在WebApp里,不是所有的library path都能放動態庫.我最后是把DLL直接放在C:/Windows/System32 下面,下次有空再研究一下怎么放在WebApp指定目錄....

3.在swig命令里最好指定package.并放到項目的相應目錄下.

4.還沒想到....

最后留下此筆記,以備未來哪天忘記了方便查閱


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 军事| 平阳县| 广宁县| 汾阳市| 珠海市| 枣阳市| 禹城市| 南澳县| 满城县| 辰溪县| 科尔| 化隆| 宽甸| 江安县| 阿瓦提县| 黎城县| 大同县| 历史| 堆龙德庆县| 龙山县| 台安县| 交城县| 孝感市| 佛坪县| 乌海市| 仙桃市| 乌拉特前旗| 桑日县| 云龙县| 怀仁县| 普洱| 托克逊县| 永平县| 甘南县| 鲜城| 友谊县| 灌云县| 尼玛县| 呼图壁县| 涿州市| 合作市|