---------Java:使用JNI实现native方法---------
Java有一个叫native的关键字,很多人都知道。但是我们该如何使用这个关键字呢?下面我就来讲解一下如何使用native关键字。
- 什么是native?如何使用它?
native关键字是一个可以帮助开发人员做到纯Java代码无法实现的操作。它可以插入在方法的定义中,像static关键字一样。但是,native方法不能有方法体(就是后面跟着的那段程序),需要用一个“;”来代替。
这是一个普通的方法:
public static void sayhello(String name){ //方法的定义
System.out.println(“hello,”+name+”!”); //方法体
}
这是一个native方法:
public native static void saybye(String name); //方法的定义
但是,没有方法体,native方法怎么执行开发者想要的操作呢?这就涉及到JNI(Java Native Interface)了。JNI可以帮助开发人员实现native方法。
- 如何用JNI实现native方法?
JNI的原理就是用其他语言来帮助Java语言执行操作。据作者所知好像只有C/C++能实现此操作。需要做的只有以下几个步骤:
创建native方法
生成C++头文件
编写C++代码
生成动态链接库
连接动态链接库并运行native方法
下面来看一个实例:
- 创建native方法
首先创建一个Java类文件,名字叫“NativeTest.java”,输入以下代码:
public class NativeTest{
public static void main(String[] args){
System.load(“NativeTest.dll”);
sayhello(“Frank”);
}
public native static void sayhello(String name);
}
- 生成C++头文件
按下Windows+R键,在弹出的窗口输入“cmd”,打开cmd窗口,输入一行指令并按回车:
cd <刚才保存NativeTest.java的文件夹的路径>
再输入一行指令并按回车:
javac NativeTest.java
再输入一行指令并按回车:
javah -jni NativeTest
你会发现在此目录下生成了一个叫”NativeTest.h”的文件。这就是生成好的C++头文件。(请先不要关闭cmd窗口!)
- 编写C++代码
先打开你的Java文件夹,找到include文件夹下的jni.h,再找到include文件夹下的win32文件夹里的jni_md.h两个文件一起复制到刚才保存NativeTest.java的文件夹的路径。再在该路径下创建一个C++类文件,名字叫“NativeTest.cpp”,输入以下代码:
#include<iostream>
#include “jni.h”
#include “jni_md.h”
#include “NativeTest.h”
#include<string>
using namespace std;
JNIEXPORT void JNICALL Java_NativeTest_sayhello(JNIEnv* env,jclass cls,jstring name){
string str=(*env).GetStringUTFChars(name,NULL);
cout<<”Hello,”<<str<<”!”<<endl;
}
- 生成动态链接库
打开刚才的cmd窗口,输入一行指令并按回车:
g++ -Wl,--add-stdcall-alias -shared -I<你的Java文件夹的路径>\include -I<你的Java文件夹的路径>\include\win32 -o NativeTest.dll NativeTest.cpp
(注意!-I和”<你的Java文件夹的路径>”之间没有空格!!!)
请不要关闭cmd窗口!
- 连接动态链接库并运行native方法
实际上我们已经连接好了动态链接库,来回顾一下这两行代码:
System.load(“<刚才保存NativeTest.cpp的文件夹的路径>\\NativeTest.dll”); //连接动态链接库
sayhello(“Frank”); //执行native方法
现在我们只需要打开刚才的cmd窗口,输入一行指令并按回车:
java NativeTest
我们会发现,控制台(命令行窗口)输出了“Hello,Frank!”。