站内搜索: 请输入搜索关键词

当前页面: 开发资料首页Java 专题第一个JNI程序--HelloNative

第一个JNI程序--HelloNative

摘要: 第一个JNI程序--HelloNative
内容: 有各种各样的原因需要使用到已有的遗留代码。此时,使用JNI,可以非常方便地调用已有的稳定的本地代码。把遗留系统和新的代码整合起来。下面我们来看如何写一个本地C代码调用的Hello World版本。

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


//HelloNative.javaclass HelloNative{
public native static void greeting();
static {
//HelloNative是下面将由HelloNative.c生成的dll文件。System.loadLibrary("HelloNative"); }};


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

生成的HelloNative.h文件如下:

/* DO NOT EDIT THIS FILE - it is machine generated */#include /* Header for class HelloNative */#ifndef _Included_HelloNative#define _Included_HelloNative#ifdef __cplusplusextern "C" {#endif/* * Class:  HelloNative * Method: greeting * Signature: ()V */JNIEXPORT void JNICALL Java_HelloNative_greeting (JNIEnv *, jclass);#ifdef __cplusplus}#endif#endif
HelloNative.c
拷贝生成的HelloNative.h,另存为HelloNative.c,并填充JNICALL Java_HelloNative_greeting方法体,得到下面的
HelloNative.c:/* DO NOT EDIT THIS FILE - it is machine generated */#include /* Header for class HelloNative */#ifndef _Included_HelloNative#define _Included_HelloNative#ifdef __cplusplusextern "C" {#endif/* * Class: HelloNative * Method: greeting * Signature: ()V */JNIEXPORT void JNICALL Java_HelloNative_greeting (JNIEnv * env, jclass cl){ printf("Hello, Native World!\n");}#ifdef __cplusplus }#endif#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文件已经准备就绪,下面写一个简单的测试程序来测试一下本地调用吧。

class HelloNativeTest { public static void main(String[] args) { HelloNative.greeting(); }}
编译、运行这个程序,将打印出Native版的:
Hello, Native World!

也许你认为这并没有什么特别,但如果你知道这个消息串是使用你自己写的C库文件中调用生成的时候,你就会有知道这有着非常重大的意义。就好像寻宝者在人迹罕至的荒山之中,突然看到一块史前陶片,陶片本身并没有什么特别,但这,也许已经为你启开了宝藏之门。

from-javaresearch Java, java, J2SE, j2se, J2EE, j2ee, J2ME, j2me, ejb, ejb3, JBOSS, jboss, spring, hibernate, jdo, struts, webwork, ajax, AJAX, mysql, MySQL, Oracle, Weblogic, Websphere, scjp, scjd
↑返回目录
前一篇: Effective java 学习笔记8
后一篇: 在Java应用程序中监视CPU的使用