`

JNI技术小试

阅读更多

目前 java dll 交互的技术主要有 3 种: jni jawin jacob Jni Java Native Interface )是 sun 提供的 java 与系统中的原生方法交互的技术(在 windows\linux 系统中,实现 java native method 互调)。目前只能由 c/c++ 实现。后两个都是 sourceforge 上的开源项目,同时也都是基于 jni 技术的 windows 系统上的一个应用库。 Jacob Java-Com Bridge )提供了 java 程序调用 microsoft com 对象中的方法的能力。而除了 com 对象外, jawin Java/Win32 integration project )还可以 win32-dll 动态链接库中的方法。就功能而言: jni >> jawin>jacob ,其大致的结构如下图:

jni 技术体系功能结构图

 

就易用性而言,正好相反: jacob>jawin>>jni

Jvm 封装了各种操作系统实际的差异性的同时,提供了 jni 技术,使得开发者可以通过 java 程序(代码)调用到操作系统相关的技术实现的库函数,从而与其他技术和系统交互,使用其他技术实现的系统的功能;同时其他技术和系统也可以通过 jni 提供的相应原生接口开调用 java 应用系统内部实现的功能。

windows 系统上,一般可执行的应用程序都是基于 native PE 结构, windows 上的 jvm 也是基于 native 结构实现的。 Java 应用体系都是构建于 jvm 之上。

 

 

 

Windows 系统上的 java 体系

 

Jni 对于应用本身来说,可以看做一个代理模式。对于开发者来说,需要使用 c/c++ 来实现一个代理程序( jni 程序)来实际操作目标原生函数, java 程序中则是 jvm 通过加载并调用此 jni 程序来间接地调用目标原生函数。

 

 

Jni 调用过程示意图

 

 

 

 

 

Jni 程序开发的一般操作步骤如下:

l          编写 java 中的调用类

l          javah 生成 c/c++ 原生函数的头文件

l          c/c++ 中调用需要的其他函数功能,实现原生函数 ( 原则上可以调用任何资源 )

l          将项目依赖的所有原生库和资源加入到 java 项目的 java.library.path

l          生成 java 程序

l          发布 java 应用和 dll

 

 

Jni 程序开发示例:

1、  eclipse 项目中新建一个 TestHello.java ,输入以下内容:

public class TestHello {

 

  static {

     System.loadLibrary ( "TestHello" );

  }

 

  public static native void hello(String msg);

 

  public static void main(String[] args) {

    

     hello ( "Hello,Kimm!" );

    

  }

 

}

编译生成 TestHello. class 文件。

2、  在命令行下使用 javah TestHello 命令,生成 TestHello.h 头文件(就是 jni 代理 stub 的接口)。

3、  VC6 中新建一个项目 TestHello, 项目类型为 Win32 Dynamic-Link Library 。点击 OK

 

在弹出的窗口中选择 A simple DLL project ,点击 Finish

 

 

打开项目所在的文件目录,将步骤 2 中生成的 TestHello.h 文件复制到此目录。点击左边中间的 FileView ,切换到文件浏览模式。在 Header Files 上点击右键,选择 Add Files to Folder…

选择 TestHello.h 文件,点击 OK

 

打开 StdAfx.h 文件,再最后面添加:

#include <jni.h>

#include "TestHello.h"

 

 

 

打开 TestHello.cpp 文件,在最后面添加一段代码:

JNIEXPORT void JNICALL Java_TestHello_hello(JNIEnv * env, jclass obj, jstring jMsg)

{

    const char *strMsgPtr = env->GetStringUTFChars( jMsg , 0);   

 

       MessageBox( 0, strMsgPtr,"Message box from VC++ ", 0 );

 

       env->ReleaseStringUTFChars( jMsg, strMsgPtr); 

 

}

 

 

 

VC 的菜单上选择 Tools-Options… ,打开选项对话框。在 Directories 文件夹,添加上 jdk 所在文件夹下的 include include\win32 文件夹。

 

 

点击 VC 上的菜单项 Build-Build All ,生成 TestHello.dll

4、  VC 项目 Debug 文件夹中的 TestHello.dll 复制到 TestHello.class 所在的文件夹下。

5、  在命令行下输入 java TestHello ,弹出 MessageBox 对话框。调用 win32 api 成功。

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics