使用swig將C/C++代碼轉為JAVA接口(Windows平台)


小弟一直沒用過Linux

平時的碼也只是在WINDOW上用SWIG或CYGWIN進行編譯。

 

下面的例子,先從網上找來一個.c文件。

 

example.c

 

[cpp]  view plain  copy
 
  1. /* File : example.c */    
  2.   
  3.   #include <time.h>    
  4.   
  5. double My_variable = 3.0;    
  6.   
  7. int fact(int n) {    
  8.   
  9.     if (n <= 1) return 1;    
  10.   
  11.  else return n*fact(n-1);    
  12.   
  13. }    
  14.   
  15. int my_mod(int x, int y) {    
  16.   
  17. return (x%y);    
  18.   
  19. }    
  20.   
  21. char *get_time()    
  22.   
  23. {    
  24.   
  25.   time_t ltime;    
  26.   
  27.  time(<ime);    
  28.   
  29.  return ctime(<ime);    
  30.   
  31. }    

 

要生成Java接口,就需要編寫.i文件。
 

文件 example.i

[plain]  view plain  copy
 
  1. /* example.i */    
  2.   
  3. %module example    
  4.   
  5. %{    
  6.   
  7. /* Put header files here or function declarations like below */    
  8.   
  9. extern double My_variable;    
  10.   
  11. extern int fact(int n);    
  12.   
  13. extern int my_mod(int x, int y);    
  14.   
  15. extern char *get_time();    
  16.   
  17. %}    
  18.   
  19.     
  20.   
  21. extern double My_variable;    
  22.   
  23. extern int fact(int n);    
  24.   
  25. extern int my_mod(int x, int y);    
  26.   
  27. extern char *get_time();   


當然如果也可以使用頭文件的形式。如果有些聲明放在頭文件中(如有個頭文件:javaApi.h),可以直接使用: 

%module  api

%{

#include "javaApi.h"

%}

%include "javaApi.h"  //注意,這里不需要使用#號

 

上面的文件保存到事先命名好的文件夾下。這里為:f:\so\sojava

 

打開SWIG;我的SWIG安裝在D:\Program Files\swigwin-2.0.4

在命令行下CMD->d:進入到D盤。輸入cd D:\Program Files\swigwin-2.0.4 進入到SWIG所在目錄。(以上這些操作在設置好環境變量后就不用這么麻煩了)

下面步驟是將.i文件生成JAVA接口

命令

swig -Java example.i

如果是編譯C++的.i文件 swig  -c++  -java example.i

如果JAVA中需要指出包名和輸出路徑可以使用一些參數如:

swig -c++  -java -package com.example -outdir ./  -l../include example.i

-package 來指定JAVA包名如:com.example

-outdir 來指定生成的文件存放路徑 ./表示當前路徑下。

-l 用來連接.i文件所在的路徑。

 

編譯后輸出有.java文件和wrap文件。

將example_wrap.c文件打包成SO;

打開CYGWIN

進入到sojava目錄

將example.c 和example_wrap.c編譯成相應的.o文件。在這個過程需要jni.h和jni_md.h。因為我的JDK是1.6的。剛開始不知道需要這個,在編的時候老報錯。

后來我搜索了下jni.h在我的CYGWIN中的目錄:lib\gcc\i686-pc-cygwin\4.5.0\include下。於是我找到我JDK中的jni.h和jni_md.h將這里的替換了。於是就編過去了。

這里我還搞不懂怎么使用路徑直接去我的JDK中的include里找jni.h。如果搞懂了就省去了替換這里的文件了。

替換后可以成功編譯。

 

使用命令:

gcc  -shared example.o example_wrap.o -o libOK.so

這樣最終生成so庫.

 

話說到這里就應該可以使用JAVA來進行loadlibrary進行驗證了。

但基於我沒有linux環境,找朋友試了一下說加載失敗,問題遺留先。我裝虛擬機了,再來搞。

 

參考:

http://www.hndy1688.com/service-45.html

http://yingchao.iteye.com/blog/625797

 

這兩篇文章不錯的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM