基本步骤

  1. 编写带有native方法的Java类。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    public class HelloWorld {

    public native void displayHelloWorld();//所有native关键词修饰的都是对本地的声明

    static {
    System.loadLibrary("hello");//载入本地库
    }

    public static void main(String[] args) {

    new HelloWorld().displayHelloWorld();

    }
    }

声明native方法:如果你想将一个方法做为一个本地方法的话,那么你就必须声明该方法为native的,并且不能实现。其中方法的参数和返回值在后面讲述。
Load动态库:System.loadLibrary(“hello”);加载动态库(我们可以这样理解:我们的方法 displayHelloWorld()没有实现,但是我们在下面就直接使用了,所以必须在使用之前对它进行初始化)这里一般是以static块进行加载的。同时需要注意的是System.loadLibrary();的参数“hello”是动态库的名字。

  1. 使用javac命令编译所编写的java类
    1
    javac .\HelloWorld.java

  1. 使用javah + java类名生成扩展名为h的头文件
    生成扩展名为h的头文件javah HelloWorld。新版jdk-10.0.2已经移除了javah命令工具,使用javac HelloWorld.java -h JniH代替javah HelloWorld 命令生成扩展名为h的头文件。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    /* DO NOT EDIT THIS FILE - it is machine generated */
    #include <jni.h>
    /* Header for class HelloWorld */

    #ifndef _Included_HelloWorld
    #define _Included_HelloWorld
    #ifdef __cplusplus
    extern "C" {
    #endif
    /*

    * Class: HelloWorld
    * Method: displayHelloWorld
    * Signature: ()V
    */
    JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld
    (JNIEnv *, jobject);

    #ifdef __cplusplus
    }
    #endif
    #endif
  2. 使用C/C++实现本地方法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include "HelloWorld.hpp"

    //#include otherheaders

    JNIEXPORT void JNICALL
    Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj)
    {
    printf("Helloworld!\n");
    return;
    }
  3. 将C/C++编写的文件生成动态连接库

  4. 运行程序