Java JNI初体验
JNI是Java Native Interface的缩写,通过使用 Java本地接口书写程序,可以确保代码在不同的平台上方便移植。 从Java1.1开始,JNI标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他编程语言,只要调用约定受支持就可以了。
下面我们通过实现一个 java JNI方法来体验一下
通过Java来调用 C++ 代码
步骤一、编写Java类
import java.io.File;
public class TestMain {
/**
* 通过静态代码块 加载 .dll 文件
* File.separator 表示盘符分割符,
*/
static
{
System.load("D:" + File.separator + "Hello.dll");
}
/**
* 定义一个 native 方法
*/
public native static void Hello();
public static void main(String[] args)
{
//调用该方法
Hello();
}
}
通过javac
编译该java文件
javac TestMain.java
步骤二 生成该类中native
方法对应的c++
头文件
1、执行 javah 生成头文件
javah -jni TestMain
执行上面的命令后会发现classpath
目录下增加了一个.h
结尾的头文件
2、打开 VS2012
-
点击文件–>新建–>项目,命名为“Hello”,和我们静态块中load进去的名字要一致
-
点击下一步
-
按照截图上的配置进行配置,并点击完成
-
将刚才由
javah
创建的.h
文件复制到新创建的C++
目录中
-
将这个
.h
文件添加到现有项中
右键头文件–>添加–>现有项,选择Hello目录下的
TestMain.h
添加进去!
- 添加一个
.cpp
源文件,编写调用代码
右键 源文件–>添加–>新建项,选择
.cpp
文件,随便命名,我叫做source.cpp
代码很简单就输出一句 Hello Java JNI
#include<iostream>
#include "TestMain.h"
using namespace std;
//这个方法头是从 javah 生成的头文件中复制过来的,不了解c++的可以直接复制过来,即可
JNIEXPORT void JNICALL Java_TestMain_Hello
(JNIEnv *, jclass)
{
cout << "Hello Java JNI" <<endl;
}
-
将
%JAVA_HOME%/include
中的jni.h
和%JAVA_HOME%/include/win32/
中的jni_md.h
两个文件复制到Hello
项目中。
将这两个头文件也按照上面的方法添加到头文件的现有项中,
最终头文件共有三个
-
修改
TestMain.h
文件中#include <jni.h>
为#include "jni.h"
生成
单击上的工具类 生成 -> 生成解决方案
这样生成的.dll
文件是32位系统下的,通过配置也可以生成64位系统下的.dll
这样就可以生成64位系统下的
.dll
文件了!
运行 java程序,即可打印出我们在c++中输出的Hello Java JNI
一定要将我们生成的.dll
文件放到我们java中指定的目录中!!
Windows Power Shell
IDEA