JNI是Java Native Interface的缩写,它提供了若干的API实现了Java和其他语言的通信,在java中通过native关键字定义本地方法,并对你要调用的其他语言的方法名对应【对应的意思是有一定命名规则。】,即可在JAVA程序中调用它们。
本教程对应Mac平台Idea开发工具,而且JDK版本不能高于1.8,否则javah将命令不可用。
1.项目准备
新建纯java项目,新建如下文件
HelloWorld.java
和HelloWorldNative.c
2.编写HelloWorld.java文件。
HelloWorld.java 文件内容如下:
public class HelloWorld {
static {
//导入 HelloWorld c语言库(即导入libHelloWorldNative.jnilib文件)
System.loadLibrary("HelloWorldNative");
}
//定义一个本地方法【类似java的接口,需要c语言去具体实现方法】
public static native void cMethod();
public static void main(String[] args){
//调用该方法
cMethod();
}
}
3.添加两个指令工具:javah
和gcc
Program:$JDKPath$/bin/javah
Parameters:-jni -classpath $OutputPath$ -d $FileDir$ $FileClass$
Working directory:$ProjectFileDir$
Program:gcc
Parameters:-dynamiclib -I /System/Library/Frameworks/JavaVM.framework/Headers $FileNameWithoutExtension$.c -o lib$FileNameWithoutExtension$.jnilib
或者(如果会报错):-dynamiclib -I $JDKPath$/include -I $JDKPath$/include/darwin $FileNameWithoutExtension$.c -o lib$FileNameWithoutExtension$.jnilib
Working directory:$FileDir$
3.编译java项目
可以看到一个
out
文件夹,里面放着编译后的class文件
4.执行生成头文件
生成后可以在同目录下看到
HelloWorld.h
文件
5.编写c语言方法
HelloWorldNative.c 文件内容如下:
#include <stdio.h>
/* 导入 生成的头文件 */
#include "HelloWorld.h"
/* 此处的方法命名要和头文件方法名相同(规则:Java语言,根包下的 HelloWorld文件中 cMethod方法) */
JNIEXPORT void JNICALL Java_HelloWorld_cMethod(JNIEnv *env, jobject c1) {
printf("Hello World Native!!\n");
}
6.生成jinlib库,让java调用
生成后在同目录下可以看到
libHelloWorld.jnilib
文件扫描二维码关注公众号,回复: 53176 查看本文章
7.运行java代码
运行报错?这是因为java虚拟机在
java.library.path
没找到HelloWorldNative
,那我们就告诉java虚拟机。
VM options:-Djava.library.path=./src/
保存后再运行就正常了!