`

java基础之JNI原理

    博客分类:
  • Java
 
阅读更多

转自:http://www.cnblogs.com/hnrainll/archive/2012/01/12/2320156.html

JNI是JAVA标准平台中的一个重要功能,它弥补了JAVA的与平台无关这一重大优点的不足,在JAVA实现跨平台的同时,也能与其它语言(如C、C++)的动态库进行交互,给其它语言发挥优势的机会。
有了JAVA标准平台的支持,使JNI模式更加易于实现和使用。在此总结了下面这个知识图:
实例:
环境说明:ubuntu 10.4.2 LTS系统
程序清单1:src/com/magc/jni/HelloWorld.java
复制代码
10  public class HelloWorld {
11 
12 static {
13 
14 System.loadLibrary("Hello");
15 
16 }
17 
18 public native void DisplayHello();
19 /**
20 @param args
21 */
22 public static void main(String[] args) {
23 
24 new HelloWorld().DisplayHello();
25 }
26 
27 }
复制代码
 进入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 */
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
复制代码
注:1)、此头文件是不需要用户编译的,直接供其它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 ! 
 
分享到:
评论

相关推荐

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

    1. **JNI基础**: JNI为Java开发者提供了一种方式来编写本地代码,这些本地代码可以与Java虚拟机(JVM)交互。JNI接口包括一系列的函数,如`FindClass`, `GetFieldID`, `CallVoidMethod`等,它们用于在Java和本地...

    Java programming with JNI

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

    java jni简单实例

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

    JNI.zip_java jni_jni

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

    jni.rar_JNI编程_java jni_jni_site:www.pudn.com

    JNI(Java Native Interface)是Java平台提供的一种标准接口,它允许Java代码和其他...通过学习和实践这些JNI编程资料,初学者可以掌握JNI的基本原理和操作,从而在实际项目中灵活运用,实现Java与本地代码的高效协同。

    Java programming with JNI.pdf

    - 虽然理论上可以将JNI解决方案分为Java编程任务和C/C++编程任务,分别由不同的程序员完成,但是为了全面理解JNI在两种编程环境中的工作原理,您需要能够理解Java和C/C++代码。 #### 二、从Java程序中调用C/C++代码...

    JAVA基础之理解JNI原理

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

    java通过jni实现口令屏蔽

    1. **JNI基础概念**: JNI是Java平台的一个标准部分,它定义了一组接口,使得Java代码能够调用本地(非Java)代码,例如C++,反之亦然。这使得开发者可以利用Java的跨平台优势,同时利用C++等原生语言的高性能和...

    java jni

    Java Native Interface(JNI)是Java平台的标准组成...这个过程展示了Java与C/C++代码的交互,是理解JNI工作原理和实践的一个基础示例。在实际开发中,可能还需要处理更复杂的类型转换、错误处理以及优化性能等问题。

    jni.zip jni编译jni下载

    同时,由于涉及到跨语言和跨平台,理解JNI的工作原理和正确使用JNI头文件至关重要,这样才能确保Java和本地代码之间的无缝交互。 在提供的压缩包`jni.zip`中,包括了`jni.h`和`jni_md.h`两个头文件,它们是进行JNI...

    java的JNI小联系

    这篇小练习将带你深入理解JNI的工作原理,并通过实践来提升你的技能。 1. JNI简介: JNI是Java平台提供的一种机制,让Java程序能够调用本地(非Java)代码,如C、C++。它为Java应用程序提供了与本地代码交互的桥梁...

    java native interface(JNI)开发全攻略

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

    JAVA C++ JNI小结一下JNI编程

    ### JNI编程概述 JNI(Java Native Interface)是Java平台的一部分,它允许Java代码与其他语言写的代码进行交互。...掌握JNI编程的基本原理和技术细节,可以帮助开发者更好地利用不同编程语言的优势。

    关于JNI的小例子 实现java与C++的方法互调

    这个简单的例子展示了JNI的基本用法,实际应用中可能涉及到更复杂的类型转换、异常处理和多线程问题,但基础原理是一样的。通过熟练掌握JNI,开发者可以在Android应用中充分利用C++的优势,提高程序性能和效率。

    Java 与 jni 部分函数Hook项目.zip

    1. JNI基础知识 JNI的核心在于为Java程序员提供了与本地代码交互的接口。它定义了一组头文件和库,使得Java虚拟机(JVM)可以调用本地方法,同时本地代码也可以调用Java对象和方法。JNI的关键概念包括JNIEnv指针、...

    java-JNI调用动态库获取硬件信息制作软件加密

    在实现了JNI调用动态库获取硬件信息的基础之上,可以进一步利用这些信息进行软件加密。具体来说,可以根据获取到的CPU ID生成唯一的软件注册码,以此来绑定用户的硬件设备。这种方式可以有效防止未授权的复制和使用...

    java jni 最少依赖

    Java JNI(Java Native Interface)是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。JNI在很多场景下都是必要的,比如访问操作系统本机服务、优化性能关键部分或者利用已有的C/C++库。本示例是...

    webrtc源码-包含python脚本编译java的JniHelper_jni.h,WebRtcClassLoader_jni.h等头文件,可以直接取头文件使用

    WebRTC(Web Real-Time Communication)是一项开放的网络技术,它允许网页浏览器进行实时通信(RTC),无需插件或额外的软件...理解和运用这些头文件以及源码,需要对Java、C++、JNI以及WebRTC的工作原理有扎实的理解。

Global site tag (gtag.js) - Google Analytics