JNI本地方法调用

Java Jni native method invoke

Posted by Monk on November 9, 2020

Java JNI本地方法调用

实现步骤

  1. 编写带有native关键字声明的java方法
  2. 使用javac编译写好的java类
  3. 使用javah -jni className来生成后缀名为 .h 的头文件
  4. 使用C或C++实现本地方法
  5. 将本地方法编写的文件生成动态链接库
编写Java类 HelloWorld.java
public class HelloWorld {

    public native void hello();

    static {
        //设置查找路径为当前项目路径
        System.setProperty("java.library.path", ".");
        //加载动态库的名称
        System.loadLibrary("hello");
    }

    public static void main(String[] args) {
        new HelloWorld().hello();
    }
}
编译Java类 HelloWorld.class

javac HelloWorld.java

生成头文件 HelloWorld.h

javah -jni HelloWorld

/* 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:    hello
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_HelloWorld_hello
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif
C语言实现本地方法 HelloWorldImpl.c
#include "jni.h"
#include "HelloWorld.h"
#include <stdio.h>
JNIEXPORT void JNICALL Java_HelloWorld_hello(JNIEnv *env,jobject obj){
    printf("Hello World Zhangsan!\n");
    return;
}
编译为动态链接库

gcc -dynamiclib -I /Library/Java/JavaVirtualMachines/jdk1.8.0_231.jdk/Contents/Home/include HelloWorldImpl.c -o libhello.jnilib

运行

java HelloWorld

结果

Hello World Zhangsan!

image