JNI系列文章:java
Java發展至今流行度和覆蓋廣度已經遍及各行各業,這依賴於它的跨平臺,易於入門編寫,強大的社區,帶來的各類各樣的框架,以及功能API庫。然而仍是有它的侷限性,好比Java的安全性(Java容易被反編譯)、性能、內存管理(成也垃圾回收,敗也垃圾回收),正式程序員沒法直接的管控到內存,才容易致使內存泄漏GC沒法回收。爲了解決這些問題使用更加高效的c/c++,因而出現了JNI(Java Native Interface)Java本地接口,便於java語言和c/c++語言的通訊。c++
注意前方高能: 學習JNI必須有C/C++的基礎,不然Native層的工程代碼你會只知其一;不知其二,甚至一路懵逼,嚴重的易致使扔鼠標、砸電腦,而後就是入門到放棄。程序員
package com.jerry.jnitest;
public class JniTest {
public static void main(String[] args) {
}
}
複製代碼
在類中寫入native的方法(就是java調用C/C++的方法)windows
/** * 經過jni,獲取c中返回的字符串 * @return 字符串 */
public native static String getStringFromC();
複製代碼
完整代碼以下:安全
package com.jerry.jnitest;
public class JniTest {
public static void main(String[] args) {
// 調用native方法,獲取C中返回的字符串數據
String text = getStringFromC();
System.out.println(text);
}
static {
System.loadLibrary("JniStudy");
}
/** * 經過jni,獲取c中返回的字符串 * @return 字符串 */
public native static String getStringFromC();
}
複製代碼
生成C中使用的native方法頭文件 (若是配置好了jdk的環境變量,正常狀況下不會有問題),cmd終端下輸入以下命令,當前終端目錄必須在java工程的src路徑下: 命令:javah com.jerry.jnitest.JniTest(native方法所在類的全名) 框架
通常狀況生成的頭文件都在src目錄下。建立C語言工程,拷貝頭文件至工程目錄 使用VS建立空的項目JniStudy,將頭文件拷貝到JniStudy目錄中 函數
在VS中的解決方案裏右擊添加現有項把頭文件添加進來: 打開頭文件這時候你會發現頭文件的代碼有紅色波浪線#include <jni.h>出錯了,那是由於jni.h的頭文件沒有包含進來,這個頭文件能夠在JDK安裝目錄的include文件夾裏能夠找到,由於jni.h自己也引用了jni_md.h頭文件,因此也要包含進來,一樣能夠在JDK安裝目錄的include下能夠搜索到。在VS中建立一個01.c的源文件用來實現頭文件中的native函數:post
#include "com_jerry_jnitest_JniTest.h"
JNIEXPORT jstring JNICALL Java_com_jerry_jnitest_JniTest_getStringFromC (JNIEnv *env, jclass jcls) {
char *str = "Hello Jerry welcome to Jni World!";
return (*env)->NewStringUTF(env, str);
}
複製代碼
這個就是實現return一個C的字符串。這樣native函數就實現了,接下來就是生成動態連接庫供java來調用native方法。性能
JNI系列文章:學習