Java Native Interface(JNI,Java本地接口)是Java语言的本地编程接口。在java程序中,咱们能够经过JNI实现一些用java语言不便实现的功能,以下:java
1)标准的java类库没有提供你的应用程序所须要的功能,一般这些功能是平台相关的(只能由其余语言编写)。linux
2)你但愿使用一些已经有的类库或者应用程序,而他们并不是用java语言编写的。c++
3)程序的某些部分对速度要求比较苛刻,你选择用汇编或者c语言来实现并在java语言中调用他们。算法
4)为了应用的安全性,会将一些复杂的逻辑和算法经过本地代码(C或C++)来实现,本地代码比字节码难以破解。编程
建议不到万不得已不要使用JNI技术,一方面它须要你掌握更多的知识才能够驾驭,一方面使用了JNI你的程序就会丧失可移植性(C/C++是非跨平台的)。windows
http://blog.csdn.net/xyang81/article/details/41777471安全
1)编写java代码函数
咱们在硬盘上创建一个hello目录做为咱们的工做目录,首先咱们须要编写本身的java代码,在java代码中咱们会声明native方法,代码很是简单(称为JNI程序,它实现的JNI规范,是JVM规范的一部分,因此能够运行于JVM)。以下所示:spa
class HelloWorld
{
public native void displayHelloWorld();
static {
System.loadLibrary("hello");
}
public static void main(String[] args) {
new HelloWorld().displayHelloWorld();
}
}
注意咱们的displayHelloWorld()方法的声明,它有一个关键字native,代表这个方法使用java之外的语言实现。方法不包括实现,由于咱们要用c/c++语言实现它。注意System.loadLibrary("hello")这句代码,它是在静态初始化块中定义的,系统用来装载hello库,这就是咱们在后面生成的hello.dll。 .net
System.loadLibrary("HelloWorld");
只须要指定动态库的名字便可,不须要加lib前缀,也不要加.so、.dll和.jnilib后缀,java会去java.library.path系统属性指定的目录下查找动态库文件,若是没有找到会抛出java.lang.UnsatisfiedLinkError异常。
System.load("/Users/yangxin/Desktop/libHelloWorld.jnilib");
指定动态库的绝对路径名,须要加上前缀和后缀
2)建立.h文件
javac HelloWorld.java,生成HelloWorld.class文件。
javah HelloWorld。这样咱们能够看到在相同目录下生成了一个HelloWorld.h文件,文件内容以下:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloWorld */
#ifndef _Included_HelloWorld
#define _Included_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: HelloWorld
* Method: displayHelloWorld
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
3)编写本地实现代码
在这部分咱们要用C/C++语言实现java中定义的方法,咱们在VC++中新建一个Project,而后建立一个HelloWorldImpl.cpp文件,内容以下
#include <jni.h>
#include "HelloWorld.h"
#include <stdio.h>
JNIEXPORT void JNICALL
Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj)
{
printf("Hello world!/n");
return;
}
注意咱们这里include了 jni.h和刚才获得的HelloWorld.h文件。所以你要在VC++里面设置好,jni.h在JAVA_HOME/include里面。编译经过后再生成hello.dll文件。
4)运行java程序
把上面生成的hello.dll文件复制到咱们的工做目录,这时候咱们的目录中包括HelloWorld.java,HelloWorld.class和hello.dll文件。运行java HelloWorld命令,则可在控制台看到Hello world!的输出了。
JNI开发流程主要分为如下6步:
1、编写声明了native方法的Java类
2、将Java源代码编译成class字节码文件
3、用javah -jni命令生成.h头文件(javah是jdk自带的一个命令,-jni参数表示将class中用native声明的函数生成jni规则的函数)
4、用本地代码实现.h头文件中的函数
5、将本地代码编译成动态库(windows:*.dll,linux/unix:*.so,mac os x:*.jnilib)
6、拷贝动态库至 java.library.path 本地库搜索目录下,并运行Java程序