小弟一直没用过Linux

平时的码也只是在WINDOW上用SWIG或CYGWIN进行编译。

下面的例子,先从网上找来一个.c文件。

example.c

  1. /* File : example.c */
  2. #include <time.h>
  3. double My_variable = 3.0;
  4. int fact(int n) {
  5. if (n <= 1) return 1;
  6. else return n*fact(n-1);
  7. }
  8. int my_mod(int x, int y) {
  9. return (x%y);
  10. }
  11. char *get_time()
  12. {
  13. time_t ltime;
  14. time(<ime);
  15. return ctime(<ime);
  16. }

要生成Java接口,就需要编写.i文件。

文件 example.i

  1. /* example.i */
  2. %module example
  3. %{
  4. /* Put header files here or function declarations like below */
  5. extern double My_variable;
  6. extern int fact(int n);
  7. extern int my_mod(int x, int y);
  8. extern char *get_time();
  9. %}
  10. extern double My_variable;
  11. extern int fact(int n);
  12. extern int my_mod(int x, int y);
  13. 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 -Javaexample.i

如果是编译C++的.i文件 swig  -c++  -javaexample.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

这两篇文章不错的。

使用swig将C/C++代码转为JAVA接口(Windows平台)的更多相关文章

  1. 使用SWIG将C++接口转换成Java接口

    PS:此文章仅作为个人记录使用,代码属于私密,故无法公开: 以C++类classifier为例,文件保存于百度网盘 https://pan.baidu.com/s/1c2AwhaS(需密码) 系统:U ...

  2. 我使用过的Linux命令之swig - 把C/C++的代码嵌入Java等语言的开发工具

    用途说明 SWIG是Simplified Wrapper and Interface Generator的缩写,其官方站点是http://www.swig.org/.SWIG是个帮助使用C或者C++编 ...

  3. IntelliJ IDEA平台下JNI编程(五)—本地C代码创建Java对象及引用

    本文学习如何在C代码中创建Java对象和对象数组,前面我们学习了C代码中访问Java对象的属性和方法,其实在创建对象时本质上也就是调用构造函数,因此本文知识学习起来也很轻松.有了前面学习数组创建的方法 ...

  4. Java实现windows,linux服务器word,excel转为PDF;aspose-words,Documents4j

    Java实现windows,linux服务器word,excel转为PDF:aspose-words,Documents4j 一.通过aspose-words将word,Excel文档转为PDF 1. ...

  5. Android C代码回调java方法

    本文将讲述下列三种C代码回调java方法 1.c代码回调java空方法 2.c代码回调java int类型参数方法 3.c代码回调javaString类型参数方法 方法都差不多,先看c代码回调java ...

  6. 博友的 编写高质量代码 改善java程序的151个建议

    编写高质量代码 改善java程序的151个建议 http://www.cnblogs.com/selene/category/876189.html

  7. 一段代码了解Java中char和int的转换

    题目要求: 将输入的大写字母转成对应小写的后5个,如A转换后为f:如果转换后大于z则从a重新计,即多出1就转成a,多出2就转成b以此类推. Java代码: ```java private static ...

  8. 编写高质量代码改善java程序的151个建议——导航开篇

    2014-05-16 09:08 by Jeff Li 前言 系列文章:[传送门] 下个星期度过这几天的奋战,会抓紧java的进阶学习.听过一句话,大哥说过,你一个月前的代码去看下,慘不忍睹是吧.确实 ...

  9. 分享非常有用的Java程序(关键代码)(八)---Java InputStream读取网络响应Response数据的方法!(重要)

    原文:分享非常有用的Java程序(关键代码)(八)---Java InputStream读取网络响应Response数据的方法!(重要) Java InputStream读取数据问题 ======== ...

随机推荐

  1. 实现手机端上下左右滑屏的jq原生代码和使用库·两种办法

    先来一个原生的.我使用的是jq. 需要注意的地方就是被触发的元素最好不要是body,这个代码也可以修改,如果obj传进来的是body那么,$(this)必须是你的监听元素,不然会冒泡泡,整个项目就…… ...

  2. 【Java】Java中常用的String方法

    本文转载于:java中常用的String方法 1 length()字符串的长度 String a = "Hello Word!"; System.out.println(a.len ...

  3. Tweet信息搜集工具tinfoleak

    Tweet信息搜集工具tinfoleak   推特是国外用户常用的社交网站.通过分析用户发布的推文以及社交活动,可以获取大量的个人信息.Kali Linux新增一款Tweet信息搜索工具tinfole ...

  4. Unity全面优化

    前言 Unity的项目优化已经是老生常谈,很多人在项目完成之后,即便创意新颖,也会觉得差强人意,原因就在于没有做详细的项目优化.众所周知,Unity是一个综合性的3D开发引擎,其中包含图像渲染,逻辑处 ...

  5. esxi上引起vm绑定浮动IP无法和外面通信

    在vmware esxi环境通过创建VM安装完成openstack之后,发现创建Instance后网络不通,经过多方面排查,最后确定是vmware esxi标准交换机拒绝“混杂模式”所致,故打开“混杂 ...

  6. 【BZOJ 2595】2595: [Wc2008]游览计划 (状压DP+spfa,斯坦纳树?)

    2595: [Wc2008]游览计划 Time Limit: 10 Sec  Memory Limit: 256 MBSec  Special JudgeSubmit: 1572  Solved: 7 ...

  7. 【BZOJ 1880】 [Sdoi2009]Elaxia的路线 (最短路树)

    1880: [Sdoi2009]Elaxia的路线 Description 最近,Elaxia和w**的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两个人在一起的时间. ...

  8. CUDA学习笔记3:CUFFT(CUDA提供了封装好的CUFFT库)的使用例子

    一.FFT介绍 傅里叶变换是数字信号处理领域一个很重要的数学变换,它用来实现将信号从时域到频域的变换,在物理学.数论.组合数学.信号处理.概率.统计.密码学.声学.光学等领域有广泛的应用.离散傅里叶变 ...

  9. Educational Codeforces Round 43 (Rated for Div. 2) ABCDE

    A. Minimum Binary Number time limit per test 1 second memory limit per test 256 megabytes input stan ...

  10. 【插头DP】BZOJ1814-Formula

    [题目大意] 给出一个m*n的矩阵里面有一些格子为障碍物,求经过所有非障碍格子的哈密顿回路个数. [思路] 最典型的插头DP.分为三种情况: (1)当前格子既没有上插头也没有左插头. 如果下边和右边都 ...