JNI 简介、基本原理

JNI是Java Native Interface的缩写,中文为JAVA本地调用。从Java1.1开始,Java Native Interface(JNI)标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他语言,只要调用约定受支持就可以了。

使用java与本地已编译的代码交互,通常会丧失平台可移植性。但是,有些情况这样做是可以接受的,甚至是必须的。例如,使用一些旧的库,与硬件、操作系统进行交互,或者为了提高程序的性能。JNI标准至少保证本地代码能工作在任何Java 虚拟机实现下。

标准的java类库可能不支持你的程序所需的特性。或许你已经有了一个用其他语言写成的库或程序,而你希望在java程序中使用它。

你可能需要用底层语言实现一个小型的时间敏感代码,比如汇编,然后在你的java程序中调用这些功能。

以下是具体步骤:

编写带有native声明的方法的java

·使用javac命令编译所编写的java类,然后使用javah + java类名生成扩展名为h的头文件

·使用C/C++实现本地方法

·将C/C++编写的文件生成动态连接库

·完成

示例:

HelloWorld.java:

package com.magc.jni;

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++程序来引用并实现其中的函数

HelloWorld.h:

/* 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

注:1)、此头文件是不需要用户编译的,直接供其它C、C++程序引用。

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

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,

应用场景

总结了一下,jni一般有以下一些应用场景

1.高性能 ,在一些情况下因为处理运算量非常大,为了获取高性能,直接使用java是不能胜任的,如:一些图形的处理

2.调用一些硬件的驱动或者一些软件的驱动,比如调用一些外部系统接口的驱动,如:读卡器的驱动,OCI驱动

3.需要使用大内存,远远超过jvm所能分配的内存,如:进程内Cache

4.调用C或者操作系统提供的服务,如:java调用搜索服务,其中搜索是由C/C++实现的,不过这个一般可以设计成更加通用的方式,比如soa的方式

所有这些场景的前提是牺牲了java代码的可移植性,不同的os,甚至版本都需要写不同版本的native实现

经测试jni实现方法比普通java方法快13~15倍。

参考:http://www.cnblogs.com/mandroid/archive/2011/06/15/2081093.html

如有问题请留言,转载注明出处。

JNI 简介、基本原理

时间: 2024-10-08 16:03:56

JNI 简介、基本原理的相关文章

【转】 Android的NDK开发(1)————Android JNI简介与调用流程

原文网址:http://blog.csdn.net/conowen/article/details/7521340 ******************************************************************************************** * author:[email protected]大钟                                                                      

Oracle官网JNI简介和接口函数分析

第一章 概述 本章主要介绍JNI(Java Native Interface),JNI是一种本地编程接口.它允许运行在JAVA虚拟机中的JAVA代码和用其他编程语言,诸如C语言.C++.汇编,写的应用和库之间的交互操作. JNI的最大优势在于没有强加任何限制在JAVA虚拟机的下层实现上,因此,JAVA虚拟机供应商能够提供JNI的支持而不影响虚拟机的其他部分,程序员只需写出一个版本的本地应用和库,就可使之运行在一切支持JNI的JAVA虚拟机上. 本章包含了以下的要点: ? JNI概述 ? 目标 ?

Android JNI简介

JNI简介 JNI (Java Native Interface),Java的本地接口 JNI是Java众多开发技术中的一门,意在利用本地代码,为Java程序提供 更高效,更灵活的拓展.应用场景包括:对运行效率敏感的算法实现.跨平台应用移植.调用系统的底层驱动.调用硬件等.尽管Java一贯以其良好的跨平台性 而著称,但真正的跨平台之王,应该是C/C++,因为当前世上90%的系统都是基于C/C++编写的.Java的跨平台,是以牺牲效率换来对多种平台的兼容性,因而JNI可以说是Java短板的补充!举

Android JNI 学习(一):JNI 简介

JNI 即 Java Native Interface 是 native 编程接口,它允许在Java虚拟机(VM)内运行Java代码与其他编程语言(主要是C和C++)编写的应用程序和库进行交互操作. JNI最重要的好处是它对底层Java VM的实现没有任何限制.因此,Java VM供应商可以添加对JNI的支持,而不会影响VM的其他部分.程序员可以编写一个native应用程序或库的版本,并期望它可以与支持JNI的所有Java VM一起使用. 本文主要将从以下几点讲述JNI相关的内容,用于我们了解J

基于Android2.3.5系统:JNI与HAL实例解析[一]

*************************************************************************************************************************** 作者:EasyWave                                                                                                           时间:2015.

JNI与底层调用1

JNI与底层调用1:http://blog.csdn.net/axi295309066/article/details/60758515 JNI与底层调用2:http://blog.csdn.net/axi295309066/article/details/60778076 C/C++在Android开发中的应用:http://blog.csdn.net/axi295309066/article/details/60954771 1. JNI 简介 1.1 什么是JNI Java Native

【Java的JNI快速学习教程】

1. JNI简介 JNI是Java Native Interface的英文缩写,意为Java本地接口. 问题来源:由于Java编写底层的应用较难实现,在一些实时性要求非常高的部分Java较难胜任(实时性要求高的地方目前还未涉及,实时性这类话题有待考究). 解决办法:Java使用JNI可以调用现有的本地库(C/C++开发任何和系统相关的程序和类库),极大地灵活Java的开发. 2. JNI快速学习教程 2.1 问题: 使用JNI写一段代码,实现string_Java_Test_helloworld

Java native方法、JNI实例及常见错误分析

1.概述 今天在看java关于调用本机代码子程序来获得较快的执行时间,或者,你希望用一个专用的第三方的库,例如统计学包.然而,因为Java程序被编译为字节码,字节码有Java运行时系统解释(或动态编译),看起来在Java程序中调用本机代码子程序是不可能.幸运的是,这个结论是错误的.Java提供了native关键字,该关键字用来声明本机代码方法.一旦声明,这些方法可以在Java程序中被调用,就像调用其他Java方法一样. 2.native关键字用法 既然Java提供了native方法,那么如何实现

Android JNI入坑之旅(一):JNI的简单介绍

1.JNI简介 JNI全称为JavaNative Interface: 从Java1.1开始,JNI就成为java平台的一部分,它允许Java代码和其他语言写的代码(如C&C++)进行交互: 并非从Android发布才引入JNI的概念的. 2.什么是NDK? NDK全称为native development kit本地语言(C&C++)开发包: NDK提供了一些交叉编译工具链和Android自带的库: 这些Android的库可以让开发者在编写本地语言的程序时调用: 而NDK提供的交叉编译工