JNI呼叫c動態連結庫函式程式碼實踐

深圳_java_易勝發表於2020-12-10

使用裝置:macOS-10.15

jni呼叫c實踐大體流程:
1、>javac HelloWorld.java,生成HelloWorld.class檔案。
2、>javah HelloWorld,生成HelloWorld.h標頭檔案。
3、建立HelloWorld.c檔案來實現HelloWorld.h標頭檔案;

4、從jdk/include目錄拷貝jni.h、jni_md.h、jawt_md.h等標頭檔案到HelloWorld.c同級目錄,且.h檔案中依賴不要用尖括號,如#include "jni.h"。
5、>gcc helloWorld.c -fPIC -shared -o hello.so,編譯HelloWorld.c檔案生成.so檔案;
6、在java應用中呼叫動態連結函式:在HelloWorld中增加main函式,靜態載入.so庫,然後呼叫HelloWorld類中的方法;

Java呼叫c程式碼實現的動態連結函式庫:

public class helloWorld{
	/**
	 * 定義需要在動態連結庫中實現的方法
	 */
	public static native void helloWorld();

	public static native void test_a();

	static{
		// 必須是動態函式庫檔案的絕對路徑
		System.load("/Users/eason/Documents/code-hub/jdk-study/vimCodes/jniTest/hello.so");
        // libtest.so函式庫中包含test_a、test_b等函式,
		System.load("/Users/eason/Documents/code-hub/jdk-study/vimCodes/jniTest/libtest.so");

	}

	public static void main(String[] args){
		helloWorld h = new helloWorld();
		h.helloWorld();
		// java.lang.UnsatisfiedLinkError
		// h.test_a();
	}
}

HelloWorld的c語言實現:

檔案列表:

 

參考:

1、Linux下gcc編譯生成動態連結庫*.so檔案並呼叫它

2、Java通過JNI呼叫C語言庫

相關文章