簡介java
JNI的實現步驟以下:.net
咱們開始來編寫一個簡單的Java call Ccode
public class HelloWorld { public native void hello(); static { //設置查找路徑爲當前項目路徑 System.setProperty("java.library.path", "."); //加載動態庫的名稱 System.loadLibrary("hello"); } public static void main(String[] args) { new HelloWorld().hello(); } }
在終端執行 : javac HelloWorld.javablog
這時會生成HelloWorld.class 文件get
在終端執行 : java HelloWorld博客
這時會生成HelloWorld.h 頭文件. 此文件內容不能修改。看下它的內容 :it
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class HelloWorld */ #ifndef _Included_HelloWorld #define _Included_HelloWorld #ifdef __cplusplus extern "C" { #endif /* * Class: HelloWorld * Method: hello * Signature: ()V */ JNIEXPORT void JNICALL Java_HelloWorld_hello (JNIEnv *, jobject); #ifdef __cplusplus } #endif #endif
建立 HelloWorldImpl.c 文件io
#include "jni.h" #include "HelloWorld.h" #include <stdio.h> JNIEXPORT void JNICALL Java_HelloWorld_hello(JNIEnv *env,jobject obj){ printf("Hello World!\n"); return; }
使用命令生成動態連接庫:編譯
gcc -dynamiclib -I /Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home/include HelloWorldImpl.c -o libhello.jnilib
libhello.jnilib 就是生成的動態連接庫。可是運行這個命令報錯了 :ast
In file included from HelloWorldImpl.c:1: /Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home/include/jni.h:45:10: fatal error: 'jni_md.h' file not found #include "jni_md.h" ^ 1 error generated.
提示jni_md.h這個文件找不到;咱們執行下面的命令拷貝一份:
sudo cp /Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home/include/darwin/jni_md.h /Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home/include
在當前目錄下執行 : ls -al
drwxr-xr-x 8 pengwei.xpw staff 272 Sep 10 15:31 . drwxr-xr-x 6 pengwei.xpw staff 204 Jan 8 2017 .. -rw-r--r-- 1 pengwei.xpw staff 567 Sep 10 15:25 HelloWorld.class -rw-r--r-- 1 pengwei.xpw staff 377 Sep 10 15:26 HelloWorld.h -rw-r--r-- 1 pengwei.xpw staff 341 Sep 10 15:25 HelloWorld.java -rw-r--r-- 1 pengwei.xpw staff 174 Sep 10 15:26 HelloWorldImpl.c drwxr-xr-x 3 pengwei.xpw staff 102 Nov 1 2016 com -rwxr-xr-x 1 pengwei.xpw staff 8400 Sep 10 15:31 libhello.jnilib
終端執行 : java HelloWorld
結果:
Hello World!
寫在最後