jni运行c++实现
2018-12-09 本文已影响25人
sunpy

native关键字
在jdk源码中出现很多native方法,而native修饰的方法的实现不是采用java实现的,而是采用c、c++语言或者其他语言实现的。
什么是JNI
前面提到了native就不得不提到JNI了,JNI全名Java Native Interface,JNI标准是java的一部分,JNI主要就是为了编译c或者C++,也可以编译其他语言,但是主要是要符合java虚拟机的运行环境规则即可。而我们看源码的一部分是采用java本身实现的,一部分是采用系统的其他语言提供的。JNI就提供了桥梁。
自定义native方法
- java程序
package cn.spy.thread;
public class JniTest {
static {
System.load("F:\\HelloWorld.dll");
}
public native static void printHelloWorld();
public static void main(String[] args) {
printHelloWorld();
}
}
- 使用jni中的javah生成头文件
先编译下java文件:javac cn/spy/thread/JniTest.java
生成头文件:
javah -jni cn.spy.thread.JniTest

- 打开vs2010编写c++代码
首先添加现有项:cn_spy_thread_JniTest.h
因为cn_spy_thread_JniTest.h这里面引用了jni.h头文件,所以在jdk1.7/include目录下的jni.h文件也需要添加进来。
编写c++代码:
#include <iostream>
#include "cn_spy_thread_JniTest.h"
using namespace std;
JNIEXPORT void JNICALL Java_cn_spy_thread_JniTest_printHelloWorld(JNIEnv *, jclass){
cout << "C++ : HelloWorld" << endl;
return;
}
-
生成项目运行java
将生成的HelloWorld.dll拷贝到指定加载目录下(我写的F盘),运行即可。
运行结果.png
细节注意
- 导入的cn_spy_thread_JniTest.h头文件中#include <jni.h>这句话是在类库路径下加载jni.头文件,如果你是程序目录的相对路径那么#include "jni.h"(#include< > 引用的是编译器的类库路径里面的头文件;#include" " 引用的是你程序目录的相对路径中的头文件)。如果违反规则,就会报找不到文件了。
- vs2010好像Debug生成的是32位的dll文件。如果你是64位系统,运行了32位系统的dll文件,那么java会报:
Can't load IA 32-bit .dll on a AMD 64-bit platform
可以添加vs2010中x64运行debug生成项目。
OpenJDK中源码
可以下载OpenJDK的源码包:OpenJDK源码包