java使用swig調用連結庫
1、i檔案編輯,直接将頭檔案包含進來即可
%module xxx
%{
#include "test.h"
%}
%include "test.h"
2、生成cxx檔案。如果連結庫是c的,-c++可以省略。
swig -c++ -java -package com.test -outdir ./ -I../include xxx.i
3、編譯cxx檔案
windows的建議采用vc編譯,linux采用codeblocks。
4、vc編譯如下:
1)、在vc6中建立新的dll工程,建立一個空白的cpp檔案,将swig生成的cxx檔案内容拷貝進去;
2)、把依賴的頭檔案拷貝到工程根目錄,也就是和上面cpp一個位置;
3)、jni.h和jni_md.h是項目依賴的,需要将它們拷貝到vc6的VC98\Include檔案夾;
4)、在根目錄下建立一個檔案夾,将需要依賴的lib檔案放進去,然後在工程--設定--連接配接頁籤中的“對象/庫子產品”中加入
lib/xxx.lib,每加一個都有空格;
5)、至此就可以調試了,調試過程中發現的代碼錯誤可以修改;
6)、在菜單欄空白處右鍵選元件,出現的新工具可以切換debug和release方式。
5、codeblocks編譯問題。
1)、解決code::blocks 不能編譯問題:
Go to the left panel that says projects, and right-click on .cpp file. Select properties, then go to build. Check the boxes under the heading Belongs in Targets: "Debug" and "Release"
2)、不讓編譯時輸出“dereferencing type-punned pointer will break strict-aliasing rules”方法
凡gcc/g++地方 都改
gcc -Wno-strict-aliasing
g++ -Wno-strict-aliasing
6、swig參數說明:
1)-c++ -java
告訴swig将C++接口轉換為java接口。如果是将C接口轉換為java接口,就不需要-c++,直接寫 swig -java就可以。
2)-package
生成的java類的包的名稱
3) -I
xxx.i中include的.h檔案的路徑
4)xxx.i
swig的.i檔案
執行這條指令後,将在swig路徑下生成幾個檔案
1)test_wrap.cxx
C++檔案,包裝器檔案。它将C++類的方法轉換為C的函數。
2)test.java
這是與剛才定義的module同名的一個類。
3)testJNI.java
打開這個檔案可以看到,C++類的方法都轉化為Java的靜态方法。
4)其他與C++類同名的Java類
每一個C++類都被轉化為與之對應的Java類,并且類名,方法明完全一樣。