发现这个不认识的关键字是在看java.lang.Object 源码的hashCode方法时
public native int hashCode();
即 JNI,Java Native Interface
Java平台有个用户和本地C代码进行互操作的API,称为Java Native Interface (Java本地接口)。
创建一个Java类
里面包含native关键字和加载库方法loadLibrary。
public class HelloNative {
static {
System.loadLibrary("HelloNative");
}
public static native void sayHello();
@SuppressWarnings("static-access")
public static void main(String[] args) {
new HelloNative().sayHello();
}
}
native 关键字告诉编译器(其实是JVM)调用的是该方法在外部定义,这里指的是C的定义的方法,而此时会报错,如下图
使用javah生成C的头文件
直接cd到当前程序的包名的上一级目录下,普通java项目的src目录 。最好将HelloNative.java创建在src目录下,这样就可以直接
javac HelloNative.java
javah -jni HelloNative
否则使用:javah com.qcby.test.HelloNative,其中javah后面的是需要生成头文件类的全路径(包名+类名),当然生成的.h文件位于src的目录下。
根据头文件,写C实现本地方法
#include "HelloNative.h"
#include <stdio.h>
JNIEXPORT void JNICALL Java_HelloNative_sayHello(JNIEnv *env, jclass thisClass)
{
printf("Hello,JNI");
}
生成动态链接库
gcc -m64 -Wl,--add-stdcall-alias -I"C:\Program Files\Java\jdk1.8.0_261\include" -I"C:\Program Files\Java\jdk1.8.0_261\include\win32" -shared -o HelloNative.dll HelloNative.c
两个目录是你的jdk的地址 最后两个文件名分别对应dll库和.c文件
执行java文件