jni运行c++实现

2018-12-09  本文已影响25人  sunpy
风景.jpg

native关键字

在jdk源码中出现很多native方法,而native修饰的方法的实现不是采用java实现的,而是采用c、c++语言或者其他语言实现的。

什么是JNI

前面提到了native就不得不提到JNI了,JNI全名Java Native Interface,JNI标准是java的一部分,JNI主要就是为了编译c或者C++,也可以编译其他语言,但是主要是要符合java虚拟机的运行环境规则即可。而我们看源码的一部分是采用java本身实现的,一部分是采用系统的其他语言提供的。JNI就提供了桥梁。

自定义native方法

  1. 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();
    }
}
  1. 使用jni中的javah生成头文件
    先编译下java文件:javac cn/spy/thread/JniTest.java
    生成头文件:
javah -jni cn.spy.thread.JniTest
JniTest头文件.png
  1. 打开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;
}
  1. 生成项目运行java
    将生成的HelloWorld.dll拷贝到指定加载目录下(我写的F盘),运行即可。


    运行结果.png

细节注意

  1. 导入的cn_spy_thread_JniTest.h头文件中#include <jni.h>这句话是在类库路径下加载jni.头文件,如果你是程序目录的相对路径那么#include "jni.h"(#include< > 引用的是编译器的类库路径里面的头文件;#include" " 引用的是你程序目录的相对路径中的头文件)。如果违反规则,就会报找不到文件了。
  2. 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源码包

上一篇 下一篇

猜你喜欢

热点阅读