xp&linux下JNI使用简例(一)

JAVA通过JNI调用本地方法,而本地方法是以库文件的形式存放的(WINDOWS平台上是DLL文件形式,在UNIX机器上是SO文件形式)。通过调用本地的库文件的内部方法,使JAVA可以实现和本地机器的紧密联系,调用系统级的各接口方法。

 

JNIJava Native Interface的缩写,它的设计目的是:  
  The standard Java class library may not support the platform-dependent features needed by your application.
  You may already have a library or application written in another programming language and you wish to make it accessible to Java applications 
  You may want to implement a small portion of time-critical code in a lower-level programming language, such as assembly, and then have your Java application call these functions

 

示例1xp下的例子使用eclipsevc6

1.新建一个java类:

public class testdll {

    static{

       System.loadLibrary("testdll"); //调用其他语言写的本地类库

}

    public native static int get();   //声明本地方法

    public native static void set(int i);  //声明本地方法

    public static void main(String[]args){

       testdll test = new testdll();

       test.set(10);                           //调用本地方法

       System.out.println(test.get());     //调用本地方法

    }

}

2.编译成class文件:javac testdll.java

3.使用javahclass文件生成扩展名为h的头文件:javah –jni testdll

这个.h文件不需要进行任何修改,其中包括了本地方法的原型,方法的具体实现需要由cc++来做。

/* DO NOT EDIT THIS FILE - it is machine generated */

#include <jni.h>

/* Header for class testdll */

#ifndef _Included_testdll

#define _Included_testdll

#ifdef __cplusplus

extern "C" {

#endif

/*

 * Class:     testdll

 * Method:    get

 * Signature: ()I

 */

JNIEXPORT jint JNICALL Java_testdll_get

  (JNIEnv *, jclass);

/*

 * Class:     testdll

 * Method:    set

 * Signature: (I)V

 */

JNIEXPORT void JNICALL Java_testdll_set

  (JNIEnv *, jclass, jint);

#ifdef __cplusplus

}

#endif

#endif

4.编写本地方法实现由javah命令生成的头文件中声明的本地方法原型

详细:新建一个空的win32 dll工程,新建一个名为testdll.cpp的源文件

#include "testdll.h"  //这里我把前面生成的testdll文件拷贝到vc dll工程中

 

int i;

JNIEXPORT jint JNICALL Java_testdll_get(JNIEnv *, jclass){

       return i;

}

JNIEXPORT void JNICALL Java_testdll_set

(JNIEnv  env,  jclass jc, jint j){

       i = j;

}

5.生成动态库:

1)命令行下编译要被java调用的c/c++ dll

cl -I"D:/Program Files/Java/jdk1.6.0_02/include" -I"D:/Program Files/Java/jdk1.6.0_02/include/win32" -LD testdll.cpp –Fetestdll.dll

2)把生成的dll文件(或so文件)拷贝到前面的testdll.calss文件所在的目录。

需要注意:文件路径有空格的,要用双引号引起来。

 

6.运行程序:java testdll

效果:

需要注意的是:在linux环境下,运行testso时,如果显示找不到libtestc.so,需要设置LD_LIBRARY_PATH为当前目录

 

小结:

1)编辑并编译java程序:    javac testdll.java

2)编译生成.h文件:    javah -jni testdll

3)编辑并编译.cpp文件

       cl命令,如:cl -I"D:/Program Files/Java/jdk1.6.0_02/include" -I"D:/Program Files/Java/jdk1.6.0_02/include/win32" -LD testdll.cppFetestdll.dll

  

--------------------------------------------------------------------------------------------

说明:本文是在参考众多资料并实践后的一个归纳总结,不能算是完全的原创,故标以“转帖”标签,以示慎重。参考的原帖未能一一表明,敬请原作者谅解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值