转自: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 }
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 }
命令: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
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;
}
#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 !
相关推荐
1. **JNI基础**: JNI为Java开发者提供了一种方式来编写本地代码,这些本地代码可以与Java虚拟机(JVM)交互。JNI接口包括一系列的函数,如`FindClass`, `GetFieldID`, `CallVoidMethod`等,它们用于在Java和本地...
虽然理论上可以将JNI任务分为Java编程任务和C/C++编程任务,分别由不同的程序员完成,但要真正理解JNI的工作原理,还是需要熟悉这两种语言的代码。 通过本教程的学习,开发者将能够更好地利用JNI来扩展Java应用程序...
本资源提供的“java jni简单实例”是一个实际应用JNI的示例,有助于学习和理解JNI的工作原理。 首先,我们来看JNI的核心概念: 1. **本地方法接口**:JNI定义了一套接口,使得Java代码能够声明本地方法(即非Java...
通过这个“JNI全攻略.pdf”文档,读者将能够深入理解JNI的工作原理,学会如何创建和使用本地方法,以及如何有效地在Java和本地代码之间进行通信。这份指南涵盖了JNI的基础知识,适合初学者快速入门,同时对于有经验...
JNI(Java Native Interface)是Java平台提供的一种标准接口,它允许Java代码和其他...通过学习和实践这些JNI编程资料,初学者可以掌握JNI的基本原理和操作,从而在实际项目中灵活运用,实现Java与本地代码的高效协同。
- 虽然理论上可以将JNI解决方案分为Java编程任务和C/C++编程任务,分别由不同的程序员完成,但是为了全面理解JNI在两种编程环境中的工作原理,您需要能够理解Java和C/C++代码。 #### 二、从Java程序中调用C/C++代码...
JNI是JAVA标准平台中的一个重要功能,它弥补了JAVA的与平台无关这一重大优点的不足,在JAVA实现跨平台的同时,也能与其它语言(如C、C++)的动态库进行交互,给其它语言发挥优势的机会。 有了JAVA标准平台的支持...
1. **JNI基础概念**: JNI是Java平台的一个标准部分,它定义了一组接口,使得Java代码能够调用本地(非Java)代码,例如C++,反之亦然。这使得开发者可以利用Java的跨平台优势,同时利用C++等原生语言的高性能和...
Java Native Interface(JNI)是Java平台的标准组成...这个过程展示了Java与C/C++代码的交互,是理解JNI工作原理和实践的一个基础示例。在实际开发中,可能还需要处理更复杂的类型转换、错误处理以及优化性能等问题。
同时,由于涉及到跨语言和跨平台,理解JNI的工作原理和正确使用JNI头文件至关重要,这样才能确保Java和本地代码之间的无缝交互。 在提供的压缩包`jni.zip`中,包括了`jni.h`和`jni_md.h`两个头文件,它们是进行JNI...
这篇小练习将带你深入理解JNI的工作原理,并通过实践来提升你的技能。 1. JNI简介: JNI是Java平台提供的一种机制,让Java程序能够调用本地(非Java)代码,如C、C++。它为Java应用程序提供了与本地代码交互的桥梁...
通过本文介绍的步骤,读者不仅能够理解JNI的基本原理,还能实际动手构建一个简单的JNI程序,为进一步探索和应用打下坚实的基础。随着对JNI的深入了解,开发者可以将其应用于更复杂的项目中,实现Java与本地代码的...
### JNI编程概述 JNI(Java Native Interface)是Java平台的一部分,它允许Java代码与其他语言写的代码进行交互。...掌握JNI编程的基本原理和技术细节,可以帮助开发者更好地利用不同编程语言的优势。
这个简单的例子展示了JNI的基本用法,实际应用中可能涉及到更复杂的类型转换、异常处理和多线程问题,但基础原理是一样的。通过熟练掌握JNI,开发者可以在Android应用中充分利用C++的优势,提高程序性能和效率。
1. JNI基础知识 JNI的核心在于为Java程序员提供了与本地代码交互的接口。它定义了一组头文件和库,使得Java虚拟机(JVM)可以调用本地方法,同时本地代码也可以调用Java对象和方法。JNI的关键概念包括JNIEnv指针、...
在实现了JNI调用动态库获取硬件信息的基础之上,可以进一步利用这些信息进行软件加密。具体来说,可以根据获取到的CPU ID生成唯一的软件注册码,以此来绑定用户的硬件设备。这种方式可以有效防止未授权的复制和使用...
Java JNI(Java Native Interface)是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。JNI在很多场景下都是必要的,比如访问操作系统本机服务、优化性能关键部分或者利用已有的C/C++库。本示例是...
WebRTC(Web Real-Time Communication)是一项开放的网络技术,它允许网页浏览器进行实时通信(RTC),无需插件或额外的软件...理解和运用这些头文件以及源码,需要对Java、C++、JNI以及WebRTC的工作原理有扎实的理解。