Chinaunix首页 | 论坛 | 博客
  • 博客访问: 104573144
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: C/C++

2008-04-15 18:58:04

    来源:ChinaITLab 

Java跨平台的特性使Java越来越受开发人员的欢迎,但也往往会听到不少的抱怨:用Java开发的图形用户窗口界面每次在启动的时候都会跳出一个控制台窗口,这个控制台窗口让本来非常棒的界面失色不少。怎么能够让通过Java开发的GUI程序不弹出Java的控制台窗口呢?

其实现在很多流行的开发环境例如JBuilder、Eclipse都是使用纯Java开发的集成环境。这些集成环境启动的时候并不会打开一个命令窗口,因为它使用了JNI(Java Native Interface)的技术。

通过这种技术,开发人员不一定要用命令行来启动Java程序,可以通过编写一个本地GUI程序直接启动Java程序,这样就可避免另外打开一个命令窗口,让开发的Java程序更加专业。

JNI允许运行在虚拟机的Java程序能够与其它语言(例如C和C++)编写的程序或者类库进行相互间的调用。同时JNI提供的一整套的API,允许将Java虚拟机直接嵌入到本地的应用程序中。

本文将介绍如何在C/C++中调用Java方法,并结合可能涉及到的问题介绍整个开发的步骤及可能遇到的难题和解决方法。本文所采用的工具是Sun公司创建的 Java Development Kit (JDK) 版本 1.3.1,以及微软公司的Visual C++ 6开发环境。

环境搭建

为了让本文以下部分的代码能够正常工作,我们必须建立一个完整的开发环境。首先需要下载并安装JDK 1.3.1,其下载地址为“”。假设安装路径为C:\JDK。下一步就是设置集成开发环境,通过Visual C++ 6的菜单Tools→Options打开选项对话框。

将目录C:\JDK\include和C:\JDK\include\win32加入到开发环境的Include Files目录中,同时将C:\JDK\lib目录添加到开发环境的Library Files目录中。这三个目录是JNI定义的一些常量、结构及方法的头文件和库文件。集成开发环境已经设置完毕,同时为了执行程序需要把Java虚拟机所用到的动态链接库所在的目录C:\JDK \jre\bin\classic设置到系统的Path环境变量中。

这里需要提出的是,某些开发人员为了方便直接将JRE所用到的DLL文件直接拷贝到系统目录下。这样做是不行的,将导致初始化Java虚拟机环境失败(返回值-1),原因是Java虚拟机是以相对路径来寻找所用到的库文件和其它一些相关文件的。

至此整个JNI的开发环境设置完毕,为了让此次JNI旅程能够顺利进行,还必须先准备一个Java类。在这个类中将用到Java中几乎所有有代表性的属性及方法,如静态方法与属性、数组、异常抛出与捕捉等。我们定义的Java程序(Demo.java)如下,本文中所有的代码演示都将基于该Java程序,代码如下:

package jni.test;
  /**
  * 该类是为了演示JNI如何
访问各种对象属性等
  * @author liudong
  */
  public class Demo {
  //用于演示如何访问静态
的基本类型属性
public static int COUNT = 8;
  //演示对象型属性
  public String msg;
  private int[] counts;
  public Demo() {
  this("缺省构造函数");
  }
  /**
   * 演示如何访问构造器
   */
  public Demo(String msg) {
   System.out.println
(":" + msg);
   this.msg = msg;
   this.counts = null;
  }
  /**
   * 该方法演示如何访问一个
访问以及中文字符的处理
   */
  public String getMessage() {
   return msg;
  }
  /**
   * 演示数组对象的访问
   */
  public int[] getCounts()
{
   return counts;
  }
  /**
   * 演示如何构造一个数组对象
  */
  public void setCounts(int[] counts)
{
   this.counts = counts;
  }
  /**
   * 演示异常的捕捉
  */
  public void throwExcp()
throws IllegalAccessException
{
throw new IllegalAccessException
("exception occur.");
  }
  }

阅读(258) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~