創建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