mac 环境下 Quantlib 使用Swig 转换到java
一、Mac安装boost方法:http://blog.csdn.net/xujiezhige/article/details/8230493
二、Swig,这里使用sudo install swig
三、如何转换一段c/c++到java:
比如有个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); }
1、现在,为了增加这些文件到你喜欢的语言中,你需要写一个接口文件(interface file)投入到swig中。这些C functions的接口文件可能如下所示:
/* 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();
2、command line:
$ swig -java example.i
如果是c++文件
$ swig -c++ -java example.i
这时directory下多了3个文件:
example.java,exampleJNI.java,example_wrap.cxx
3、找到mac上的java_home,比如我的是:
Library/Java/JavaVirtualMachines/jdk1.8.0_77.jdk/Contents/Home/include
命令行: $
cc -c example.cpp example_wrap.cxx -I/Library/Java/JavaVirtualMachines/jdk1.8.0_77.jdk/Contents/Home/include/,
这时会报错说找不到文件jni_md.h,找到include,此时发现include下面有个darwin,把下面jni_md.h复制到include下面,
再输入上面的命令行,通过。
此时directory下面多了两个文件:
example.o,example_wrap.o
4、输入命令行:cc -framework JavaVM -bundle example.o example_wrap.o -o libexample.jnilib
生成了一个新的文件 libexample.jnilib,如果没有这个文件,直接javac main.java,会报错:
Exception in thread "main" java.lang.UnsatisfiedLinkError: no example in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1867)
at java.lang.Runtime.loadLibrary0(Runtime.java:870)
at java.lang.System.loadLibrary(System.java:1122)
at main.main(main.java:12)
5、在文件夹下新建一个main.java,输入
public class main { public static void main(String argv[]) { System.loadLibrary("example"); System.out.println(example.getMy_variable()); System.out.println(example.fact(5)); System.out.println(example.get_time()); } }
注意,如果没有system.loadLibrary("example"); 这句,会报错误:
Exception in thread "main" java.lang.UnsatisfiedLinkError: exampleJNI.My_variable_get()D
at exampleJNI.My_variable_get(Native Method)
at example.getMy_variable(example.java:16)
at main.main(main.java:13)
输入命令行:$ javac main.java ,文件夹下多了3个文件:example.class, exampleJNI.class, main.class
输入命令行:$ java main
输出:
3.0
120
Mon Apr 25 10:56:18 2016
到此使用swig转换到java完成。