cygwin, minGW and JNI

cygwin 可以说是大名鼎鼎 ,卖点是在windows 系统上给你linux 的使用体验。喜欢使用linux的朋友在只有windows 可用的情况下,装个cygwin,打开cygwin 的命令行就可以敲击linux命令,感觉爽歪歪。 问题是 在cygwin环境下能编译c代码吗?编译后的东东是原生的windows程序吗?

minGW (minimium Gnu for Windows)也是个响当当的自由软件项目,号称windows上的Gnu, 它与cygwin又有什么区别呢?

cygwin主页:  http://www.cygwin.org/

minGW 主页:  http://www.mingw.org/


  • cygwin和minGW比较

 下面我们分别使用它们,编译并运行一个helloworld程序,看看它们的差别。

到 http://sourceforge.net/projects/mingw/files/ 下载最新的Download mingw-get-inst-YYYYmmDD.exe 然后安装,比如安装到E:\MinGW\

http://www.cygwin.com/ 下载最新的 setup-x86.exe(32或者 setup-x86_64.exe( 64位机),然后点击安装,比如安装到 D:\cygwin1.7

1.  双击cygwin快捷方式进入命令行窗口,编辑以下文件(HelloWorld.c)

#include <stdio.h>
main(){
printf("Hello,world!\n");
}
然后执行 cc -o HelloWorld  HelloWorld.c

会生成HelloWorld.exe , 大小大约是12.1k字节。

在cygwin命令行下执行HelloWorld.exe,会正确地打印出 Hello, world!

2.双击minGWshell快捷方式进入命令行窗口,编辑HelloWorld.c  , 内容与上边的HelloWorld.c相同。

然后执行 cc -o HelloWorld HelloWorld.c

注意也会生成一个HelloWorld.exe , 大小大约是46.9k字节。

大小差别很大!!

在minGW命令行下执行HelloWorld.exe,也会正确地打印出 Hello, world!

3. 在windows命令行执行  或者explorer下点击在cygwin下生成的HelloWorld.exe,会报错:没有找到cygwin1.dll,因此应用程序未能启动。


在windows命令行下执行 minGW生成的HelloWorld.exe,则会正确地打印出 Hello, world!

为什么呢?

根本原因在于 minGW 可以在Windows平台生成本地的Windows程序而不需要第三方C运行时库;

而cygwin 生成的程序是借助于cygwin的运行库来运行windows程序。这就是cygwin下的程序不能单独运行的原因。

cygwin的系统调用都是通过cygwin运行库的这个二传手来进行的,这似乎解释了为什么刚才的HelloWorld.exe程序比minGW下的小的原因。

为了验证我们的想法,找到cygwin1.dll (cygwin\bin目录)将其放到cygwin下包含生成的HelloWorld.exe目录下,再次在windows命令行中执行: HelloWold.exe

可以看到 执行成功。

由此,相对cygwin, minGW更适合来生成windows下的c程序,因为可独立打包,不依赖于第三方运行库。


*** 缺省的minGW下载包只能编译win32程序 其结果不能用在64bit的windows上。******

要编译64bit的windows上的C/C++程序需要minGW-w64 (http://sourceforge.net/projects/mingw-w64/),minGW-w64只有源码,需要重新build才能使用,过程比较麻烦。可以考虑使用TDM-GCC,既可编译32bit也可编译 64位,它包含了minGW和minGW-w64的功能,下载安装即可使用,下载网址:http://tdm-gcc.tdragon.net/

  • 用minGW来生成dll库并被JNI程序使用

看看如何使用TDM-GCC安装的 minGW-64 来编译C程序生成dll,并被JNI 程序使用。

以64bit Windows为例:

进入TDM-GCC安装的minGW64命令行:

1.创建一个Java类: HelloWorld.java

public class HelloWorld {
 //declare the JNI method
  public native   double  sum(double x,double y);

  static{
    System.loadLibrary("sum");
    }

  public static void main(String[] args){
      System.out.println(new HelloWorld().sum(3.3,6.7));
     }  

}

2.编译HelloWorld.java  (javac  HelloWorld.java)

3.生成HelloWorld 使用JNI的头文件 (javah HelloWorld)

4.创建一个C程序 :sum.c

#include <jni.h>
#include "HelloWorld.h"
#include <stdio.h>

JNIEXPORT  jdouble JNICALL Java_HelloWorld_sum(JNIEnv *env,jobject obj,jdouble a,jdouble b){
printf("Hello,world!\n");
return a+b;
}

5.利用minGW64由 sum.c 生成dll:

gcc  -Wall   -D_JNI_IMPLEMENTATION_ -Wl,--kill-at     -I%JAVA_HOME%/include     -I%JAVA_HOME%/include/win32    -shared   -o  sum.dll  sum.c

6.执行java HelloWorld :

可以看到命令行输出 :

Hello,World!

10.0


如果在32bit windows上运行,进入minGW shell,执行以上步骤即可。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值