JNI概述和示例

1 概述

1.1 Jni概述

jni(Java Native Interface)标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计 的,但是它并不妨碍你使用其他语言,只要调用约定受支持就可以了。使用java与本地已编译的代码交互,通常会丧失平台可移植性。但是,有些情况下这样做是可以接受的,甚至是必须的,比如,使用一些旧的库,与硬件、操作系统进行交互,或者为了提高程序的性能。JNI标准至少保证本地代码能工作在任何Java 虚拟机实现下。

1.2 native关键字

使用native关键字说明这个方法是原生函数,也就是这个方法是用C/C++语言实现的,并且被编译成了DLL,由java去调用。 这些函数的实现体在DLL中,JDK的源代码中并不包含,你应该是看不到的。对于不同的平台它们也是不同的。这也是java的底层机制,实际上java就是在不同的平台上调用不同的native方法实现对操作系统的访问的。
java是跨平台的语言,既然是跨了平台,所付出的代价就是牺牲一些对底层的控制,而java要实现对底层的控制,就需要一些其他语言的帮助,这个就是native的作用了。

1.3 步骤

1、编写带有native声明的方法的java类,生成.java文件
2、使用javac命令编译所编写的java类,生成.class文件
3、使用javah -jni java类名生成扩展名为h的头文件,也即生成.h文件
4、使用C/C++(或者其他编程想语言)实现本地方法,创建.h文件的实现,也就是创建.cpp文件实现.h文件中的方法
5、将C/C++编写的文件生成动态连接库,生成.dll文件

2示例

2.1 声明native方法,装载动态链接库。

public class Alice {
    public native void display();
}

“Alice”(Alice.dll)是要装入的动态链接库名称。

public class Main {

    static {
        System.loadLibrary("Alice");
    }

    public static void main(String[] args) {
        Alice alice = new Alice();
        alice.display();
    }
}

2.2 编译生成.class文件

使用javac命令编译Alice.java文件生成Alice.class。(在Eclipse自动完成,Alice.class存在工程的bin目录下)

2.3 生成.h文件

使用javah -jni 命令生成Alice.head,首先定位到C:\Program Files\Java\jdk1.8.0_25\bin(javah.exe所在目录),将Alice.class复制至此目录中,Alice.h也会在此目录中生成。

cd C:\Program Files\Java\jdk1.8.0_25\bin
javah -jni Alice

使用javah -jni 命令

打开Alice.h文件,编写Alice.cpp文件时要去实现JNIEXPORT void JNICALL Java_Alice_display (JNIEnv *, jobject) 函数

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class Alice */

#ifndef _Included_Alice
#define _Included_Alice
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     Alice
 * Method:    display
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_Alice_display
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

2.4 编写Alice.cpp文件

主要是用C/C++实现JNIEXPORT void JNICALL Java_Alice_display (JNIEnv *, jobject) 函数,生成在E:\Software\Eclipse\MyProjects\jni 目录下。

#include "Alice.h"
#include <stdio.h>
#include <jni.h>

/*
 * Class:     Alice
 * Method:    display
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_Alice_display
  (JNIEnv *, jobject)
{
    printf("Hello World!\n");
    return;
}

2.5 生成.dll文件(动态链接库)。

C:\Program Files\Java\jdk1.8.0_25\include\jni.h
C:\Program Files\Java\jdk1.8.0_25\include\win32\jni_md.h
C:\Program Files\Java\jdk1.8.0_25\bin\Alice.h 这三个文件拷贝到
E:\Software\Eclipse\MyProjects\jni目录下。

E:\Software\Eclipse\MyProjects\jni目录

使用Visual Studio x64 Win64命令提示(我的Visual Sudio版本为2010)。

Visual Studio x64 Win64命令提示

cl/LD E:\Software\Eclipse\MyProjects\jni\Alice.cpp  

执行cl/LD命令

执行命令成功后将在E:\Software\Microsoft Visual Studio 10.0\VC目录中生成以下四个文件。
Alice.dll
Alice.exp
Alice.lib
Alice.obj

2.6 添加.dll到Java工程

我的做法是在此工程中添加jni目录,并将Alice.dll添加到此jni目录中。

工程目录

将此jni目录设为该工程引用dll库的路径设置(system.loadLibrary()调用Dll路径问题)
右击项目名|选择属性properties|在左边列表内选择“Java Build Path”|在右边选项卡用选择“source”|点开项目名前的“+”号,选择“Native library location”,“Edit”选择上面dll路径。

工程引用.dll库的路径

2.7 运行工程

运行工程

控制台成功打印”Hello World!”

3 参考资料

http://blog.csdn.net/xw13106209/article/details/6989415
http://blog.csdn.net/code_nice/article/details/48086003
http://www.07net01.com/zhishi/229508.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值