java调用C++代码-JNI的使用

JNI是Java Native Interface的缩写,中文为JAVA本地调用。
从Java1.1开始,Java Native Interface(JNI)标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。
JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他语言,只要调用约定受支持就可以了。
JNI可以调用C/C++编译好的库文件,在windows上面是dll文件,在linux上面是.so文件。
在加载动态链接库时,只需要指定名称即可,文件的后缀名又操作系统自己辨别。

步骤1:
首先编写一个java类:
例如:

import java.io.BufferedReader;

import java.io.InputStreamReader;

class Test{

    /**

     * 加载动态链接库

     */

    static{

        System.loadLibrary("jnitest");

    }

    /**

     * 声明本地方法。即需要调用的C/C++实现的代码

     */

    public native static int sum(int a,int b);



    public static void main(String[] args)throws Exception{

        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));

        int x = reader.readLine().charAt(0);

        System.out.println(x);

        int y = reader.readLine().charAt(0);

        System.out.println(y);

        int sum = sum(x,y);

        System.out.println(sum);

    }

}

步骤2:
javac Test.java
生成Test.class文件
步骤3:
javah Test
生成Test.h
内容如下:

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

#include <jni.h>

/* Header for class Test */



#ifndef _Included_Test

#define _Included_Test

#ifdef __cplusplus

extern "C" {

#endif

/*

 * Class:     Test

 * Method:    sum

 * Signature: (II)I

 */

JNIEXPORT jint JNICALL Java_Test_sum

  (JNIEnv *, jclass, jint, jint);



#ifdef __cplusplus

}

#endif

#endif

我们需要关心的只有下面这个部分

/*

 * Class:     Test

 * Method:    sum

 * Signature: (II)I

 */

JNIEXPORT jint JNICALL Java_Test_sum

  (JNIEnv *, jclass, jint, jint);

步骤4:
根据Test.h编写Test.cpp实现相应的方法。

#include <Test.h>//包含头文件

/*

 * Class:     Test

 * Method:    sum

 * Signature: (II)I

 */

JNIEXPORT jint JNICALL Java_Test_sum(JNIEnv *, jclass, jint a, jint b)

{

    return a+b;

}

步骤5:
在VC6.0中新建一个动态链接库工程。
将Test.h和Test.cpp导入进去,编译链接,会在工程的Debug目录下生成一个dll文件。
步骤6:
将dll文件放到Test.class所在的目录。
java Test运行。


Notice:
1、用高版本jdk编译的class文件无法使用低版本的jdk运行
2、VC6.0编译得到的dll是32位的,无法在64位的机器上加载。
3、windows上生成的文件是dll。无法在linux上面使用。

你可能感兴趣的:(java)