1、基本概念
JNI(Java Native Interface)是Java提供的一种用于实现Java代码和本地代码(如C/C++)相互调用的技术。通过JNI,我们可以在Java代码中调用本地代码的函数,实现Java与本地代码的互操作。
2、HelloJNI 实战
第1步:创建 HelloJNI.java 文件,并输入以下代码
public class HelloJNI {
static {
System.loadLibrary("HelloJNI");
}
private native void sayHello();
public static void main(String[] args){
new HelloJNI().sayHello();
}
}
第2步:通过 HelloJNI.java 文件生成 HelloJNI.h 头文件
javac -h . HelloJNI.java
生成的头文件内容如下:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloJNI */
#ifndef _Included_HelloJNI
#define _Included_HelloJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: HelloJNI
* Method: sayHello
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloJNI_sayHello
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
第 3 步:创建 HelloJNI.c 文件,实现头文件中申明的方法
#include <jni.h>
#include <stdio.h>
#include "HelloJNI.h"
JNIEXPORT void JNICALL Java_HelloJNI_sayHello (JNIEnv *, jobject){
printf("Hello JIN!\n");
return 0;
}
编译 HelloJNI.c 文件
gcc -shared -o libHelloJNI.dylib HelloJNI.c
执行发现报错,提示没有jni.h文件,这是因为在HelloJNI.h头文件中又包含了其他jni.h头文件,jni.h中又包括了jni_md.h头文件,这两个头文件在jdk的安装目录中而不在系统的头文件目录中,gcc不知道去哪里找这两个头文件,所以要在gcc的命令中指定这两个头文件所在的路径,执行的命令改成:
gcc -I"$JAVA_HOME/include" -I"$JAVA_HOME/include/darwin" -shared -o libHelloJNI.dylib HelloJNI.c
注意: 1、这里使用了环境变量 JAVA_HOME,如果没有配置的话,可以使用全路径替换 2、因为我使用的是是 Mac 电脑,所以输出的文件名是 libHelloJNI.dylib 如果是 Windows 电脑,则文件名改为 libHelloJNI.dll 如果是 Linux 电脑,则文件名改为 libHelloJNI.so
第 4 步:执行 class 文件,验证 JNI 调用是否成功
java HelloJNI
可以看到调用库里面的方法成功了