创建java类HelloJNI.java放在com目录下
package com;
public class HelloJNI {
static {
System.loadLibrary("hello");
}
private native void sayHello();
public static void main(String[] args) {
new HelloJNI().sayHello();
}
}
编译HelloJNI.java生成HelloJNI.class
javac HelloJNI.java
将jdk目录中的/usr/java/jdk1.8.0_191/include下的jni.h和jni_md.h放在com同级目录下,编译出com_HelloJNI.h
javah com.HelloJNI
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_HelloJNI */
#ifndef _Included_com_HelloJNI
#define _Included_com_HelloJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_HelloJNI
* Method: sayHello
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_HelloJNI_sayHello
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
编写C代码HelloJNI.c
#include <jni.h>
#include <stdio.h>
#include "com_HelloJNI.h"
JNIEXPORT void JNICALL Java_com_HelloJNI_sayHello(JNIEnv *env, jobject thisObj) {
printf("Hello World!\n");
return;
}
编译so文件
gcc -fPIC --shared HelloJNI.c -o libhello.so -I /usr/java/jdk1.8.0_191/include/
编译时需要/usr/java/jdk1.8.0_191/include/路径下的jni.h和jni_md.h两个文件。
使用nm libhello.so命令查看sayHelllo方法
运行java,使用-Djava.library.path=./ 来明确告诉VM我们的库在哪里
java -Djava.library.path=./ com.HelloJNI