`

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 成功。

 

 

分享到:
评论

相关推荐

    JNI技术各类文档

    JNI,全称Java Native Interface,是Java平台标准的一部分,它为...总的来说,JNI技术是Java开发者必备的技能之一,尤其在需要与本地代码交互或进行性能优化时。理解并熟练掌握JNI,能够极大地扩展Java应用程序的能力。

    AndroidJNI技术实现

    在深入探讨Android JNI技术实现的过程中,我们首先需要理解JNI(Java Native Interface)的基本概念与作用。JNI是一种标准的Java平台接口,它允许Java代码与其他语言(如C、C++)编写的本地代码进行交互,这对于...

    android使用jni技术

    本教程将深入探讨如何在Android应用中使用JNI技术。 首先,我们需要理解JNI的工作原理。JNI提供了一种方式,使得Java代码可以调用本地(非Java)函数,同时本地代码也可以调用Java方法。这通常是通过创建本地方法...

    JNI 完全技术手册

    - JNI技术手册中涵盖了使用JNI从Java调用C/C++代码的详细步骤,包括从Java代码调用C/C++的六个步骤。 -JNI的使用涉及数据类型的对应关系,包括Java基本数据类型和引用类型(如String、对象、数组)与C/C++类型的转换...

    JNI完全技术手册

    这个"JNI完全技术手册"显然是一份详尽的指南,涵盖了JNI的各个方面,包括基本概念、设置环境、调用本地方法、处理数据类型、异常处理等。下面将详细介绍这些知识点。 1. **JNI基础**:JNI是Java与本地代码交互的...

    JNI技术手册

    这份"JNI技术手册"包含了对JNI的深入理解和实践操作的全面指导。 JNI的核心概念主要包括以下几个部分: 1. **本地方法接口**:JNI提供了一套接口,使得Java虚拟机(JVM)能够调用本地(非Java)代码,同时也让本地...

    JNI技术开发步骤详解

    JNI(Java Native Interface)技术是Java平台提供的一种接口,允许Java代码和其他语言写的代码进行交互。在嵌入式软件开发中,JNI起到了桥梁的作用,它连接了Java虚拟机(JVM)与本地(非Java)代码,使得开发者可以...

    Java技术(JNI)实践

    Java技术中的JNI(Java Native Interface)是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。JNI在很多场景下都是必要的,比如优化性能、访问操作系统特定功能、调用已有的C/C++库等。在这个...

    JNI技术相关的三个Demo

    本篇将深入探讨三个JNI技术相关的Demo,涵盖Java调用C/C++,C/C++调用Java以及JNI中的数据类型转换和访问。 1. **Java调用C/C++**: 在这个Demo中,Java代码通过JNI接口来调用C或C++函数。首先,你需要在Java类中...

    java的JNI跨平台技术

    ### Java的JNI跨平台技术详解 #### 一、引言 随着互联网技术的快速发展与广泛应用,跨平台服务的需求日益增长。为了满足这一需求,许多网络服务商开始开发自己的网络服务(Web Service),以抢占逐渐明晰的面向...

    JNI完全技术手册.pdf

    这本书《JNI完全技术手册》应该是深入探讨这个主题的详细指南。 JNI的核心概念主要包括以下几个方面: 1. **本地方法接口**:本地方法是Java类中的一个方法,但它的实现是在本地(非Java)代码中。JNI提供了定义和...

    Java JNI 技术文档教程

    ### Java JNI 技术文档教程知识点详解 #### 一、JNI技术概述 **Java Native Interface (JNI)** 是Java平台的一项强大特性,它允许Java应用程序调用用其他编程语言(如C或C++)编写的本地代码,同时也支持从这些...

    jni.zip jni编译jni下载

    JNI,全称Java Native Interface,是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。JNI在很多场景下非常有用,比如当需要利用已有的C或C++库,或者提升性能时,我们可以通过JNI将Java代码与本地...

    JNI DEMO:java jni技术 调用 c/c++ 的dll

    总结来说,这个"JNI DEMO"是一个完整的示例,展示了如何使用Java的JNI技术来调用C/C++编写的DLL。它包括了Java代码、JNI接口的实现、DLL的编译以及Java应用的运行。对于初学者,这是一个很好的实践教程,即使没有...

    JNI资料技术文档

    JNI(Java Native Interface)是Java平台的一个重要组成部分,它允许Java代码和其他语言写的代码进行交互。JNI在Android开发中尤其重要,因为它是连接Java应用程序与本地C/C++库的桥梁,尤其是在性能敏感或需要利用...

    帮你快速上手JNI技术

    标题“帮你快速上手JNI技术”表明了本文档将指导读者如何快速学习并掌握JNI(Java Native Interface)技术。JNI是Java编程语言提供的一种标准编程接口,允许Java代码与其他语言写的代码进行交互,尤其是C和C++代码。...

Global site tag (gtag.js) - Google Analytics