Java之本地整合方法----JNI的简略实现


Java之本地整合方法----JNI的简略实现。

1.JNI基本概念
    Java具有很好的平台无关性,但当与其它基于平台完成的项目进行整合时,解决办法当然不能把已有项目全部重新用Java写一遍,
那最好的方法是什么呢?让Java直接调用本地API!没错,JNI正是其解。
    JNI是Java Native Interface的缩写,设计它的主要目的有:
    1)应用程序需要一些依赖于平台的要素,但标准Java类可能不支持。
    2)Java应用直接访问其它语言编写的库和应用程序。
    3)可能需要用一些低级编程语言比如汇编,编写一些限时性代码,然后由Java来调用这些功能。

2. JNI实现方法
    下面就JNI的调用过程描述一个简单实例,以展现该过程基本方法。
    本实例实现功能非常简单,Java类调用本地一个加法运算,将结果用MessageBox报告出来。
    平台: JDK 1.5.0_14, WindowsXP,
    工具: Eclipse 3.3, Visul Studio 6.0
    1) Java类部分:
        Java类需要
       
public class JNICall
{
    static
    {
        System.loadLibrary("JNIExer"); // Loading dll in memory
    }
   
    native void reportResult(int arg0, int arg1);

    public JNICall()
    {
        System.out.println("construct in the Java program");
    }

    /**
     * @param args
     */
    public static void main(String[] args)
    {
    // TODO Auto-generated method stub
        JNICall JNT = new JNICall();
        JNT.reportResult( 25, 52 );
    }

}

2)生成JNICall.h头文件
命令行:javah JNICall
生成结果如下:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class JNICall */

#ifndef _Included_JNICall
#define _Included_JNICall
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     JNICall
 * Method:    reportResult
 * Signature: (II)V
 */
JNIEXPORT void JNICALL Java_JNICall_reportResult
  (JNIEnv *, jobject, jint, jint);

#ifdef __cplusplus
}
#endif
#endif

3)VC6, 兴建DLL工程,名为JNIExer, 将JNICall.h包含进来,并将JDK下include目录设置为VC的Include目录。
将JNIEXPORT void JNICALL Java_JNICall_reportResult实现完成,实现内容为:
JNIEXPORT void JNICALL Java_JNICall_reportResult
  (JNIEnv *evn, jobject job, jint arg0, jint arg1 )
{
    char strResult[10];
    sprintf( strResult, "%d", arg0+arg1 );
   
    MessageBox( 0, strResult, "the result is: ", 0 );
}


编译,构造,得到JNIExer.dll。
至此,本地库已经完成。

4)
    将JNIExer.dll拷贝到JNICall.class同一目录下,在Eclipse里面运行JNICall.java。
    运行时,如果报UnSatisfiedLinkError错误,需要设置JVM设置参数.
    可在运行之前,先对其运行设置。
    打开运行对话框,在"参数“选项卡里的”VM auguments"里填上如下语句:
    -Djava.library.path="path"  (path是指JNICall.class所在目录路径)
    运行JNICall,得到结果。
 

3. 总结
   在介绍过程中,首先将加法功能实现在VC构造的DLL里,并在实现过程中调用本地API:MessageBox(),实现了本地调用的过程。
   有关JNI的文档有:
   http://java.sun.com/j2se/1.5.0/docs/guide/jni/spec/jniTOC.html
  

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值