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(&ltime);
     return ctime(&ltime);
 }
 

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完成。

 

 

 

posted on 2016-04-25 11:04  重八  阅读(1277)  评论(0编辑  收藏  举报

导航