使用swig将C/C++代码转为JAVA接口(Windows平台)
小弟一直没用过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 -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平台)的更多相关文章
- 使用SWIG将C++接口转换成Java接口
PS:此文章仅作为个人记录使用,代码属于私密,故无法公开: 以C++类classifier为例,文件保存于百度网盘 https://pan.baidu.com/s/1c2AwhaS(需密码) 系统:U ...
- 我使用过的Linux命令之swig - 把C/C++的代码嵌入Java等语言的开发工具
用途说明 SWIG是Simplified Wrapper and Interface Generator的缩写,其官方站点是http://www.swig.org/.SWIG是个帮助使用C或者C++编 ...
- IntelliJ IDEA平台下JNI编程(五)—本地C代码创建Java对象及引用
本文学习如何在C代码中创建Java对象和对象数组,前面我们学习了C代码中访问Java对象的属性和方法,其实在创建对象时本质上也就是调用构造函数,因此本文知识学习起来也很轻松.有了前面学习数组创建的方法 ...
- Java实现windows,linux服务器word,excel转为PDF;aspose-words,Documents4j
Java实现windows,linux服务器word,excel转为PDF:aspose-words,Documents4j 一.通过aspose-words将word,Excel文档转为PDF 1. ...
- Android C代码回调java方法
本文将讲述下列三种C代码回调java方法 1.c代码回调java空方法 2.c代码回调java int类型参数方法 3.c代码回调javaString类型参数方法 方法都差不多,先看c代码回调java ...
- 博友的 编写高质量代码 改善java程序的151个建议
编写高质量代码 改善java程序的151个建议 http://www.cnblogs.com/selene/category/876189.html
- 一段代码了解Java中char和int的转换
题目要求: 将输入的大写字母转成对应小写的后5个,如A转换后为f:如果转换后大于z则从a重新计,即多出1就转成a,多出2就转成b以此类推. Java代码: ```java private static ...
- 编写高质量代码改善java程序的151个建议——导航开篇
2014-05-16 09:08 by Jeff Li 前言 系列文章:[传送门] 下个星期度过这几天的奋战,会抓紧java的进阶学习.听过一句话,大哥说过,你一个月前的代码去看下,慘不忍睹是吧.确实 ...
- 分享非常有用的Java程序(关键代码)(八)---Java InputStream读取网络响应Response数据的方法!(重要)
原文:分享非常有用的Java程序(关键代码)(八)---Java InputStream读取网络响应Response数据的方法!(重要) Java InputStream读取数据问题 ======== ...
随机推荐
- 【BZOJ】4311: 向量(线段树分治板子题)
题解 我们可以根据点积的定义,垂直于原点到给定点构成的直线作一条直线,从正无穷往下平移,第一个碰到的点就是答案 像什么,上凸壳哇 可是--动态维护上凸壳? 我们可以离线,计算每个点能造成贡献的一个询问 ...
- Windows 命令行切换目录
Windows 命令行切换目录 特别注意:切换到其它盘符不需要 cd 命令 1. 切换到 C 盘根目录 打开终端 cmd 后,输入cd C:\(一定要加上后面的反斜扛) 2.切换到 C 盘子目录 打开 ...
- laravel windows安装(composer)
1.安装composer参考windows 安装tp5 composer方式 2.先配置好本地虚拟域名,在cmd里面切换到网站根目录 ... 3.安装成功之后,在浏览器输入已配置的虚拟域名我的是,la ...
- 图片热点的使用,html <area> 的用法
<area>标记主要用于图像地图,通过该标记可以在图像地图中设定作用区域(又称为热点),这样当用户的鼠标移到指定的作用区域点击时,会自动链接到预先设定好的页面.其基本语法结构如下: < ...
- 《java虚拟机》----虚拟机字节码执行引擎
No1: 物理机的执行引擎是直接建立在处理器.硬件.指令集合操作系统层面上的,而虚拟机的执行引擎则是由自己实现的,因此可以自行制定指令集与执行引擎的结构体系,并且能够执行那些不被硬件直接支持的指令集格 ...
- Linux_x64_Pwn溢出漏洞
linux_64与linux_86的区别 linux_64与linux_86的区别主要有两点: 首先是内存地址的范围由32位变成了64位 但是可以使用的内存地址不能大于0x00007fffffffff ...
- oracle 查询数据库中 有数据的表
select table_name from ALL_TABLES where TABLESPACE_NAME='xxx' and NUM_ROWS > 0 order by table_na ...
- NOIP初赛前一日记
2018年10月12日,早晨7:25于机房. 早晨的鄞中,晨风还有点清冷.看着电脑上翻遍的资料,心里实在是有一种说不出的感觉. 说出来也算是丢脸——作为浙江选手,我为了NOIP2018的初赛,停课了一 ...
- 洛谷 P1115 最大子段和
P1115 最大子段和 题目描述 给出一段序列,选出其中连续且非空的一段使得这段和最大. 输入输出格式 输入格式: 输入文件maxsum1.in的第一行是一个正整数N,表示了序列的长度. 第2行包含N ...
- CodeForces 1063B. Labyrinth 性质
给定$n *m$的格子 询问从$(r, c)$开始最多向左走$x$步,向右走$y$步 询问有多少个格子可以从$(r, c)$到达 有障碍物,$n, m \leqslant 2 * 10^3$ 对于一个 ...