`
newleague
  • 浏览: 1499394 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类

Java基础之理解JNI原理

 
阅读更多

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

AD: <script src="http://www.51cto.com/js/article/keywords_ad_new.js"></script>

 

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

Java基础之理解JNI原理

实例:

环境说明:ubuntu 10.4.2 LTS系统

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

  1. /**  
  2.   *   
  3.   */ 
  4.   package com.magc.jni;   
  5.  /**  
  6.   * @author magc  
  7.   *  
  8.   */ 
  9. public class HelloWorld {     
  10.     static {       
  11.         System.loadLibrary("Hello");          
  12.     }  
  13.     public     native void DisplayHello();  
  14.     /**  
  15.      * @param args  
  16.      */ 
  17.     public static void main(String[] args) {  
  18.         new HelloWorld().DisplayHello();  
  19.     }  
  20.  } 

进入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)、此头文件是不需要用户编译的,直接供其

  1. /* DO NOT EDIT THIS FILE - it is machine generated */ 
  2.  #include <jni.h>  
  3.  /* Header for class com_magc_jni_HelloWorld */ 
  4.    
  5.  #ifndef _Included_com_magc_jni_HelloWorld  
  6.  #define _Included_com_magc_jni_HelloWorld  
  7.  #ifdef __cplusplus  
  8.  extern "C" {  
  9.  #endif  
  10.  /*  
  11.   * Class:     com_magc_jni_HelloWorld  
  12.   * Method:    DisplayHello  
  13.   * Signature: ()V  
  14.   */ 
  15.  JNIEXPORT void JNICALL Java_com_magc_jni_HelloWorld_DisplayHello  
  16.    (JNIEnv *, jobject);  
  17.    
  18.  #ifdef __cplusplus  
  19.  }  
  20.  #endif  
  21.  #endif 

它C、C++程序引用。

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

程序清单3:src/jni_helloworldImpl.cpp

  1. #include <jni.h>  
  2. #include "com_magc_jni_HelloWorld.h" 
  3. #include <stdio.h>  
  4. JNIEXPORT void JNICALL Java_com_magc_jni_HelloWorld_DisplayHello  
  5. (JNIEnv *env, jobject obj)  
  6. {  
  7.     printf("From jni_helloworldImpl.cpp :");  
  8.     printf("Hello world ! \n");  
  9.     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://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++...

    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,来适应自己的需求,比如使用不同的数据库或者...

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

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

    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