`
Java_KAbanban
  • 浏览: 38139 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java基础之理解JNI原理

    博客分类:
  • Java
阅读更多
    JNI是JAVA标准平台中的一个重要功能,它弥补了JAVA的与平台无关这一重大优点的不足,在JAVA实现跨平台的同时,也能与其它语言(如C、C++)的动态库进行交互,给其它语言发挥优势的机会。有了JAVA标准平台的支持,使JNI模式更加易于实现和使用。
   
  
   实例:

环境说明:ubuntu 10.4.2 LTS系统

程序清单1:src/com/magc/jni/HelloWorld.java

/**   
  *    
  */ 
package com.magc.jni;  
/**   
  * @author magc   
  *   
  */
  public class HelloWorld {        
  static {              
     System.loadLibrary("Hello");             
  }     
  public  native void DisplayHello();     
/**     
  * @param args     
  */   
  public static void main(String[] args) {       
    new HelloWorld().DisplayHello();     
  }  
}
进入src目录下,编译该JAVA类,

命令:javac ./com/magc/jni/HelloWorld.java

在该HelloWorld.java所在目录下生成HelloWorld.class

然后使用javah生成头文件,

命令:javah -jni com.magc.jni.HelloWorld

在当前目录下生成com_magc_jni_HelloWorld.h头文件,此文件供C、C++程序来引用并实现其中的函数

程序清单2:com_magc_jni_HelloWorld.h

注:1)、此头文件是不需要用户编译的,直接供其

/* DO NOT EDIT THIS FILE - it is machine generated */ 
  #include <jni.h>  
/* Header for class com_magc_jni_HelloWorld */    
  #ifndef _Included_com_magc_jni_HelloWorld  
  #define _Included_com_magc_jni_HelloWorld  
  #ifdef __cplusplus   extern "C" {  
      #endif  
/*   
* Class:     com_magc_jni_HelloWorld   
* Method:    DisplayHello   
* Signature: ()V   
*/ 
JNIEXPORT void JNICALL Java_com_magc_jni_HelloWorld_DisplayHello(JNIEnv *, jobject);      #ifdef __cplusplus   }  
#endif  
#endif
它C、C++程序引用。

2)、此头文件中的Java_com_magc_jni_HelloWorld_DisplayHello(JNIEnv *, jobject)方法,是将来与动态链接库交互的接口,并需要名字保持一致。

程序清单3:src/jni_helloworldImpl.cpp

  #include <jni.h> 
  #include "com_magc_jni_HelloWorld.h"
  #include <stdio.h>
  JNIEXPORT void JNICALL Java_com_magc_jni_HelloWorld_DisplayHello 
  (JNIEnv *env, jobject   obj)  {   
       printf("From jni_helloworldImpl.cpp :");     
       printf("Hello world ! \n");    
       return; 
  }
  此C++文件实现了上述头文件中的函数,注意方法函数名要保持一致。

编译生成动态库libHello.so,

命令:g++ -shared -I /usr/lib/jvm/java-6-openjdk/include jni_helloworldImpl.cpp -o libHello.so

成功后,便会在当前目录下生成动态链接库libHello.so文件。

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

命令:java -Djava.library.path=. com.magc.jni.HelloWorld

输入结果即为:From jni_helloworldImpl.cpp :Hello world !
  哈哈,大家看看是不是很简单啊
转自:http://soft.chinabyte.com/database/228/12102228.shtml
分享到:
评论
12 楼 seagod.wong 2011-06-22  
图都看不清啊···看原帖去
11 楼 Dominic_jin 2011-06-21  
不懂c++,如何在win下编译生成动态链接库
10 楼 diggywang 2011-06-21  
JNA要简单很多,起码少了C
9 楼 burnquist 2011-06-21  
偶尔会看到JNT,但是没怎么深入了解
无意中发现这帖子点进来一看,解释得还是很简单明了的
8 楼 phoenixup 2011-06-21  
zhanghh321 写道
JNI这个东西就是调用本地方法是吗?  主要用在哪里啊

JNI的功能目前是提供调用C/C++编写的库提供的接口(当然C/C++调用Java类库的接口也是可以的,不过这个基本没什么应用场景)。
最初JNI的目的我的理解是在系统的某些部分对性能和资源要求很苛刻,使用JAVA又无法满足的场景中用C/C++能满足要求,在Java系统中使用同时又不影响这个Java系统的结构的目的。

我经手的一个项目,有部分功能局域网流量分析,对于DPI分析比较常见的用的libpcap,但是由整个应用系统上层是JAVA的,而Java的PCAP库都不尽如人意,所以使用JNI来链接Java系统与libpcap模块,目前看来效果不错。
7 楼 songfantasy 2011-06-20  
原理呢?这只是个超低级的例子啊?
6 楼 zhanghh321 2011-06-20  
JNI这个东西就是调用本地方法是吗?  主要用在哪里啊
5 楼 nick.s.ni 2011-06-20  
用过,但是中文下面很麻烦,尤其是在简体中文的服务器上你传参数的时候有繁体中文。
如果真的调用还不如写好exe程序直接Runtime执行。或是监控目录走文件传输。或是MQ,JMS
4 楼 arsenal04 2011-06-19  
skyyks0001 写道
个人觉得JNA比JNI方便得多

这帖子很不错,说明加例子,是否有JNA的类似说明?
3 楼 skyyks0001 2011-06-19  
个人觉得JNA比JNI方便得多
2 楼 Java_KAbanban 2011-06-19  
我错了!!求原谅
1 楼 IcyFenix 2011-06-19  
楼主,转载不说明出处是不道德的
http://www.cnblogs.com/mandroid/archive/2011/06/15/2081093.html

相关推荐

    JAVA基础之理解JNI原理

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

    JAVA通过JNI调用C#dll的整个项目工程

    Java通过JNI调用C# DLL是一个跨平台、跨语言的技术实践,主要应用于需要利用Java的稳定性和C#的高性能...通过学习和实践这个工程,开发者可以进一步提升跨语言编程的能力,更好地理解和掌握JNI以及P/Invoke的工作原理。

    JNI实现原理权威指南

    要深入理解JNI的实现原理,本书《JNI实现原理权威指南》无疑是提供了一个全面的技术指导和规范说明。 ### 知识点一:JNI的概念及其重要性 JNI是Java平台标准版的一部分,它为Java代码和本地应用程序接口(API)...

    android C/C++程序

    其次,`JAVA基础之理解JNI原理`这篇博客可能会深入解析JNI的工作原理,包括JNI头文件的生成、JNI函数的声明和实现,以及如何在Java类中声明本地方法并调用。理解JNI原理对于编写高效且无错误的跨语言调用至关重要。 ...

    深入探索Java JNI:Java Native Interface的工作原理与应用

    通过本文的详细介绍,你应该能够理解JNI的工作原理、使用场景和基本使用方法。JNI是一个强大的工具,但也需要谨慎使用,以避免常见的陷阱和性能问题。随着Java平台的发展,JNI仍然是连接Java与其他语言的重要桥梁。

    java jni简单实例

    本资源提供的“java jni简单实例”是一个实际应用JNI的示例,有助于学习和理解JNI的工作原理。 首先,我们来看JNI的核心概念: 1. **本地方法接口**:JNI定义了一套接口,使得Java代码能够声明本地方法(即非Java...

    Java programming with JNI

    虽然理论上可以将JNI任务分为Java编程任务和C/C++编程任务,分别由不同的程序员完成,但要真正理解JNI的工作原理,还是需要熟悉这两种语言的代码。 通过本教程的学习,开发者将能够更好地利用JNI来扩展Java应用程序...

    vc调用java的示例:jni_VC2Java

    开发者需要理解JNI的原理,学习如何在C++中创建JNI函数,并在Java代码中适当地声明和调用这些函数。这个过程涉及到了Java和C++的混编,需要对两种语言都有一定的掌握。同时,正确配置工程文件和管理依赖关系也是成功...

    Delphi10.3 中通过JNI调用 Java 函数

    首先,我们需要了解JNI的基本工作原理。JNI的核心是Java虚拟机(JVM)和本地方法接口。当Java代码调用本地方法时,JVM会通过JNI接口找到相应的本地代码,并执行该代码。在Delphi中,我们需要编写C或C++的动态链接库...

    java调用C源程序(JNI)

    下面我们将深入探讨JNI的工作原理、使用步骤以及如何结合Java和C/C++代码。 1. **JNI简介** JNI是Java平台的一部分,它为Java应用程序提供了一种方式来调用本地方法(即非Java代码)。这些本地方法可以是C、C++...

    使用C++创建java虚拟机JVM,使用JNI调用java函数.zip

    这是一项技术性很强的任务,需要对C++编程、Java虚拟机的工作原理以及JNI接口有深入的理解。 首先,Java虚拟机(JVM)是Java平台的核心组成部分,它负责执行Java字节码。C++创建JVM的过程主要分为以下几步: 1. **...

    java高级jni教程

    这篇教程旨在帮助开发者深入理解JNI的工作原理,并掌握实际开发中的应用技巧。 首先,JNI的核心概念包括Java虚拟机(JVM)、本地方法接口(Native Method Interface)和本地方法库。JVM是Java程序运行的载体,它...

    JNI.zip_java jni_jni

    通过这个“JNI全攻略.pdf”文档,读者将能够深入理解JNI的工作原理,学会如何创建和使用本地方法,以及如何有效地在Java和本地代码之间进行通信。这份指南涵盖了JNI的基础知识,适合初学者快速入门,同时对于有经验...

    JNI_C_Java.zip_java 调c_jni_jni c_jni回调_编程之法

    JNI,全称Java Native Interface,是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行...理解JNI的工作原理和API,以及如何在C++中安全地操作Java对象和方法,对于开发跨语言的系统或高性能应用至关重要。

    java的jni实例(内有详细说明)

    本实例提供了一个使用JNI调用C++ DLL(动态链接库)的示例,对于学习和理解JNI的工作原理及其应用非常有帮助。 首先,我们来了解JNI的基本概念。JNI包含了一组头文件和库,它们定义了Java虚拟机(JVM)与本地代码...

    java native interface(JNI)开发全攻略

    通过本文介绍的步骤,读者不仅能够理解JNI的基本原理,还能实际动手构建一个简单的JNI程序,为进一步探索和应用打下坚实的基础。随着对JNI的深入了解,开发者可以将其应用于更复杂的项目中,实现Java与本地代码的...

    JNI-DEMO.zip_DEMO_JNI DEMO_java JNI Demo_jni_leveldb jni demo

    这个DEMO对于理解JNI的工作原理和实践,以及Java如何与C/C++库集成,特别是与LevelDB这样的数据库系统交互,具有很好的学习价值。开发者可以通过分析和修改这个DEMO,来适应自己的需求,比如使用不同的数据库或者...

    JAVA通过JNI调用C++代码函数的示例DEMO

    首先,我们需要理解JNI的工作原理。JNI提供了一种方式,让Java虚拟机(JVM)能够调用本地方法,这些方法可以是C、C++或者其他本地语言编写的。JNI包括一系列的头文件和库,开发者需要编写Java代码和C/C++代码两部分...

    Java 本地接口(JNI)编程指南和规范

    为了帮助开发者更好地理解JNI的原理和实现细节,本书包含了丰富的技术讨论和有效使用JNI的实用提示。这些内容基于Sun Microsystems工程师和社区开发者在 JNI 发布初期的两年经验积累。书中还详细介绍了JNI各种特性的...

Global site tag (gtag.js) - Google Analytics