中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档 | 网通镜像
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > Java > J2SE
第一个JNI程序--HelloNative
作者:未知 时间:2005-07-24 21:13 出处:JR 责编:chinaitpower
              摘要:第一个JNI程序--HelloNative
有各种各样的原因需要使用到已有的遗留代码。此时,使用JNI,可以非常方便地调用已有的稳定的本地代码。把遗留系统和新的代码整合起来。下面我们来看如何写一个本地C代码调用的Hello World版本。

在本实例中,包括下面几个类:
HelloNative.java:实用类,提供一个静态本地方法greeting(),打印出一个消息串。其中greeting方法调用了下面的本地代码。
HelloNative.c:本地实现代码。
HelloNativeTest.java:应用主文件,调用HelloNative实用类的greeting()方法。

HelloNative.java


  1. //HelloNative.java
  2. class HelloNative
  3. {
  4.     public native static void greeting();
  5.     static 
  6.     {
  7.         //HelloNative是下面将由HelloNative.c生成的dll文件。
  8. System.loadLibrary("HelloNative"); 
  9.     }
  10. };

编译上面的.java文件后,在生成的.class目录下,使用javah命令生成HelloNative.class的C头文件:
javah HelloNative

HelloNative.h


生成的HelloNative.h文件如下:
  1. /* DO NOT EDIT THIS FILE - it is machine generated */
  2. #include <jni.h>
  3. /* Header for class HelloNative */
  4. #ifndef _Included_HelloNative
  5. #define _Included_HelloNative
  6. #ifdef __cplusplus
  7. extern "C" {
  8. #endif
  9. /*
  10.  * Class:     HelloNative
  11.  * Method:    greeting
  12.  * Signature: ()V
  13.  */
  14. JNIEXPORT void JNICALL Java_HelloNative_greeting
  15.   (JNIEnv *, jclass);
  16. #ifdef __cplusplus
  17. }
  18. #endif
  19. #endif

HelloNative.c

拷贝生成的HelloNative.h,另存为HelloNative.c,并填充JNICALL Java_HelloNative_greeting方法体,得到下面的
  1. HelloNative.c:
  2. /* DO NOT EDIT THIS FILE - it is machine generated */
  3. #include <jni.h>
  4. /* Header for class HelloNative */
  5. #ifndef _Included_HelloNative
  6. #define _Included_HelloNative
  7. #ifdef __cplusplus
  8. extern "C" {
  9. #endif
  10. /*
  11.  * Class:     HelloNative
  12.  * Method:    greeting
  13.  * Signature: ()V
  14.  */
  15. JNIEXPORT void JNICALL Java_HelloNative_greeting
  16.   (JNIEnv * env, jclass cl)
  17. {
  18.     printf("Hello, Native World!\n");
  19. }
  20. #ifdef __cplusplus
  21.     }
  22. #endif
  23. #endif
使用Windows自带的c/c++编译器,编译上面的HelloNative.c:

cl -Id:\j2sdk1.4.1\include -Id:\j2sdk1.4.1\include\win32 -LD HelloNative.c -FeHelloNative.dll

执行这条命令后将生成HelloNative.dll文件。这个DLL动态链接库就是下面我们在HelloNative.java文件中调用的本地文件。如果是在Unix/Linux下,请使用相应操作系统的c编译器,生成的库文件是HelloNative.so。

开始运行吧


至此,我们编写的Windows平台上的本地库文件和Java文件已经准备就绪,下面写一个简单的测试程序来测试一下本地调用吧。
  1. class HelloNativeTest 
  2. {
  3.     public static void main(String[] args) 
  4.     {
  5.         HelloNative.greeting();
  6.     }
  7. }
编译、运行这个程序,将打印出Native版的:
Hello, Native World!

也许你认为这并没有什么特别,但如果你知道这个消息串是使用你自己写的C库文件中调用生成的时候,你就会有知道这有着非常重大的意义。就好像寻宝者在人迹罕至的荒山之中,突然看到一块史前陶片,陶片本身并没有什么特别,但这,也许已经为你启开了宝藏之门。
关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有