• 使用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:sosojava

    打开SWIG;我的SWIG安装在D:Program Filesswigwin-2.0.4

    在命令行下CMD->d:进入到D盘。输入cd D:Program Filesswigwin-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中的目录:libgcci686-pc-cygwin4.5.0include下。于是我找到我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

    这两篇文章不错的。

  • 相关阅读:
    步步为营——算法初阶 1.算法概述
    Spring学习【Spring概述】
    Codeforces 490F Treeland Tour 树上的最长上升子序列
    汽车电商竞争白热化,“五大门派”谁能登顶?
    程序猿的出路
    Android Studio Share Project On Github
    hdu 1022 Train Problem I(栈的应用+STL)
    Scala, Groovy, Clojure, Jython, JRuby and Java ----我们的工作语言
    Oracle GoldenGate (ogg) 11.2.1.0.20 是最后一个支持oracle db 10g的 ogg版本号
    javascript异步代码的回调地狱以及JQuery.deferred提供的promise解决方式
  • 原文地址:https://www.cnblogs.com/fnlingnzb-learner/p/7278524.html
Copyright © 2020-2023  润新知