15、Jni介绍

来源:互联网 发布:极速格斗网络电影 编辑:程序博客网 时间:2024/05/19 23:03
 JNI是JAVA标准平台中的一个重要功能,它弥补了JAVA的与平台无关这一重大优点的不足,在JAVA实现跨平台的同时,也能与其它语言(如C、C++)的动态库进行交互,给其它语言发挥优势的机会。

举例说明:

1、java程序清单:

package cn;

public class HelloWorld {

       /**
                * @param args
                */

        static {

                System.loadLibrary("hello");

        }

        public native void DisplayHello();

        public static void main(String[] args) {
                        // TODO Auto-generated method stub
                        new HelloWorld().DisplayHello();
                }

}

2、javac ./cn/HelloWorld.java 编译源文件 ,生成相应的字节码文件HelloWorld.class

3、使用javah生成头文件

javah -jni cn.HelloWorld 为本地方法生成HelloWorld.h文件(在当前目录下生成)

内容:

/* DO NOT EDIT THIS FILE - it is machine generated */
        #include <jni.h>
        /* Header for class cn_HelloWorld */

#ifndef _Included_cn_HelloWorld
        #define _Included_cn_HelloWorld
        #ifdef __cplusplus
        extern "C" {
        #endif
        /*
          * Class: cn_HelloWorld
          * Method: DisplayHello
          * Signature: ()V
        */
        JNIEXPORT void JNICALL Java_cn_HelloWorld_DisplayHello
        (JNIEnv *, jobject);

#ifdef __cplusplus
        }
        #endif
        #endif

注:1)、此头文件是不需要用户编译的,直接供其它C、C++程序引用。

2)、此头文件中的Java_cn_HelloWorld_DisplayHello(JNIEnv *, jobject)方法,是将来与动态链接库交互的接口。

4、vi MyHelloWorldImp.c 编写C语言实现 java_cn_HelloWorld_DisplayHello()方法

#include <jni.h>
        #include "cn_HelloWorld.h"
        #include <stdio.h>
         JNIEXPORT void JNICALL Java_cn_HelloWorld_DisplayHello
        (JNIEnv *env, jobject obj)
        {
                printf("**From MyHelloWorldImpl.c :");
                 printf("Hello world ! \n");
                return;
        }

5、生成动态库

gcc -I/usr/jdk1.5.0_21/include/ -I/usr/jdk1.5.0_21/include/linux/ MyHelloWorldImp.c -o libhello.so -shared -fPIC

在当前目录下生成动态链接库libhello.so文件:

6、有了具体实现的动态库后,就可以运行JAVA调用JNI程序类的native方法.

java -Djava.library.path=. cn.HelloWorld

结果: