swig_JAVA程序调用C/C++库_方法四

转自大佬的博客: https://blog.csdn.net/fengsh998/article/details/8140587
可参考博客: http://yingchao.iteye.com/blog/625797

 

下面的例子,先从网上找来一个.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 -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中的目录: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

 

这两篇文章不错的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值