小弟一直沒用過Linux。
平時的碼也只是在WINDOW上用SWIG或CYGWIN進行編譯。
下面的例子,先從網上找來一個.c文件。
example.c
- /* File : example.c */
- #include <time.h>
- double My_variable = 3.0;
- int fact(int n) {
- if (n <= 1) return 1;
- else return n*fact(n-1);
- }
- int my_mod(int x, int y) {
- return (x%y);
- }
- char *get_time()
- {
- time_t ltime;
- time(<ime);
- return ctime(<ime);
- }
要生成Java接口,就需要編寫.i文件。
文件 example.i
- /* example.i */
- %module example
- %{
- /* Put header files here or function declarations like below */
- extern double My_variable;
- extern int fact(int n);
- extern int my_mod(int x, int y);
- extern char *get_time();
- %}
- extern double My_variable;
- extern int fact(int n);
- extern int my_mod(int x, int y);
- 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
這兩篇文章不錯的。