簡介
JNI的實現步驟如下:
- 編寫帶有native聲明的方法的Java類
- 使用javac命令編譯編寫的Java類
- 使用java -jni className 來生成后綴名為.h的頭文件
- 使用其他語言(C、C++)實現本地方法
- 將本地方法編寫的文件生成動態鏈接庫
我們開始來編寫一個簡單的Java call C
1、編寫含有native方法的Java類
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();
}
}
2、編譯代碼
在終端執行 : javac HelloWorld.java
這時會生成HelloWorld.class 文件
3、使用java -jni className 生成后綴名為.h的頭文件
在終端執行 : java HelloWorld
這時會生成HelloWorld.h 頭文件. 此文件內容不能修改。看下它的內容 :
/* 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
4、使用C語言實現本地方法
創建 HelloWorldImpl.c 文件
#include "jni.h"
#include "HelloWorld.h"
#include <stdio.h>
JNIEXPORT void JNICALL Java_HelloWorld_hello(JNIEnv *env,jobject obj){
printf("Hello World!\n");
return;
}
5、將本地方法編寫的文件生成動態鏈接庫
使用命令生成動態鏈接庫:
gcc -dynamiclib -I /Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home/include HelloWorldImpl.c -o libhello.jnilib
libhello.jnilib 就是生成的動態鏈接庫。但是運行這個命令報錯了 :
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
6、last, 執行可執行文件
終端執行 : java HelloWorld
結果:
Hello World!
寫在最后