JAVA开发 分析JNI标准原理,附实例

来源:互联网 发布:兼职网络写手怎么赚钱 编辑:程序博客网 时间:2024/04/29 18:22

JNI已成为JAVA平台的一部分,它允许JAVA代码和其他语言写的代码进行交互。

                JNI是JAVA Native Interface的缩写,中文为JAVA本地调用。

             JNI是JAVA标准平台中的一个重要功能,它弥补了JAVA的与平台无关这一重大优点的不足,在JAVA实现跨平台的同时,也能与其它语言(如C、C++)的动态库进行交互,给其它语言发挥优势的机会。

            有了JAVA标准平台的支持,使JNI模式更加易于实现和使用。在此总结了下面这个知识图:

 

调用C++函数实例:

        环境说明:Win XP系统

     1. 在MyEclipse 下新建JniTest项目,然后新建HelloWorld.java和TestDll.java 类

           HelloWorld.java源码:

         public class HelloWorld {
 
          public native void displayHelloWorld();   //java 本地方法申明
          static{
              System.loadLibrary("HelloWorld");   //装入(加载)动态链接库,"HelloWorld"是要装入的动态链接库名称
                 }
        }

    

        TestDll.java源码:

     public class TestDll {
            public static void main(String[] args) {
            HelloWorld helloWorld = new HelloWorld();
           helloWorld.displayHelloWorld();
           }

       }

 

   2. 编译JAVA类得到CLASS 文件

 

 3. 生成C/C++头文件:

      在windows中代开一个命令窗口,进入jnitest工程所在目录下的bin目录(其实就是找到生成的HelloWorld.class所在的目录),键入 javah -jni HelloWorld 后在当前目录生成 头文件HelloWorld.h。内容如下

     HelloWorld.h 源码:

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

#ifndef _Included_com_wudi_jni_HelloWorld
#define _Included_com_wudi_jni_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_wudi_jni_HelloWorld
 * Method:    displayHelloWorld
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_jni_HelloWorld_displayHelloWorld
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

 

4. 本地方法实现

      在VS2010中新建C++的Win32 动态链接库项目,项目名HelloWorld 。将上述生成的HelloWorld.h拷贝到HelloWorld目录下面;将JDK安装目录下

include目录中的文件都拷贝到VS安装目录下的VC98\Include目录下面。

     在VS中新建HelloWorld.cpp文件,实现头文件中生命的方法并编译生成DLL。

    HelloWorld.cpp源码:

#include "stdafx.h"
#include<jni.h>
#include "HelloWorld.h"
#include<stdio.h>
JNIEXPORT void JNICALL Java_com_wudi_jni_HelloWorld_displayHelloWorld
(JNIEnv *env,jobject obj)
{
 printf("From jni_helloWorldImpl.cpp:");
 printf("Hello world!This is a JNI invoke demo. \n");
 return;
}

 

    5. 运行测试程序

    先将生成的DLL拷贝到jnitest工程的bin下面,然后设置DLL搜索路径(环境变量PATH)为当前bin目录(JNI并没有规定必须将dll放在与class文件相同的目录,只要确保JVM能搜索到DLL即可;或者将dll拷贝到system32系统目录下也可以)。刷新项目,运行测试程序,将看到控制台输出:

From jni_helloWorldImpl.cpp:Hello world!This is a JNI invoke demo.


原创粉丝点击