JNI系列之入門Hello JNI C(一)

JNI系列文章:java

  1. JNI系列之入門Hello JNI C(一)
  2. JNI系列之入門Hello JNI C(二)
  3. JNI系列入門之C語言與Java的雙向通訊(一)
  4. JNI系列入門之C語言與Java的雙向通訊(二)
  5. JNI系列入門之C語言中文字符串亂碼問題

1、概述

Java發展至今流行度和覆蓋廣度已經遍及各行各業,這依賴於它的跨平臺,易於入門編寫,強大的社區,帶來的各類各樣的框架,以及功能API庫。然而仍是有它的侷限性,好比Java的安全性(Java容易被反編譯)、性能、內存管理(成也垃圾回收,敗也垃圾回收),正式程序員沒法直接的管控到內存,才容易致使內存泄漏GC沒法回收。爲了解決這些問題使用更加高效的c/c++,因而出現了JNI(Java Native Interface)Java本地接口,便於java語言和c/c++語言的通訊。c++

注意前方高能: 學習JNI必須有C/C++的基礎,不然Native層的工程代碼你會只知其一;不知其二,甚至一路懵逼,嚴重的易致使扔鼠標、砸電腦,而後就是入門到放棄程序員

2、環境搭建

  1. Java代碼的編寫目前使用Eclipse,C/C++的代碼編寫以及編譯運行環境是Visual Studio + Windows 64位
  2. 首先配置Java的 jdk環境變量,這個對於一個java的老司機來講太簡單了很少說。
  3. 安裝好Visual Studio這個也不用說,問度娘,個人VS版本是:Visual Studio community 2015,安裝包有點大,安裝挺快的,也就大概一天吧,哈哈哈哈哈哈哈哈哈。

3、編碼實現

  • Java代碼 使用Eclipse建立一個普通的Java Project,而後建立一個類:JniTest
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方法所在類的全名) 框架

    生成native方法的頭文件.png
    通常狀況生成的頭文件都在src目錄下。

  • 建立C語言工程,拷貝頭文件至工程目錄 使用VS建立空的項目JniStudy,將頭文件拷貝到JniStudy目錄中 函數

    Paste_Image.png
    在VS中的解決方案裏右擊添加現有項把頭文件添加進來:
    Paste_Image.png
    打開頭文件這時候你會發現頭文件的代碼有紅色波浪線#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方法。性能

  • 先將VS的編譯環境改爲你的系統的,個人windows 64位:
    Paste_Image.png
    Paste_Image.png
    修改編譯運行的文件:
    Paste_Image.png
    接下來生成動態連接庫
    Paste_Image.png
    生成的是windows下的dll,生成的文件在工程目錄的x64/debug/jni_study.dll

Paste_Image.png

  • 將動態連接庫所在的目錄配置到系統的Path環境變量裏:
    Paste_Image.png
    若是你不限麻煩的話,也能夠將生成的動態庫拷貝到Java工程的更目錄下。
  • 環境變量配置好後,重啓Eclipse
  • 而後運行Java工程的JniTest這個類。 運行結果:
    Paste_Image.png
    看這個是main方法裏調用 getStringFromC()的native方法,C工程代碼返回來的字符串:Hello Jerry welcome to Jni World!

4、總結

  1. 在java工程編寫native方法
  2. 使用javah 命令生成頭文件
  3. 拷貝頭文件到C工程,以及相應的jni.h、jni_md.h頭文件
  4. 實現頭文件的native方法
  5. 修改VS編譯運行環境,配置項改爲生成dll動態庫
  6. 生成解決方案,配置dll動態庫所在目錄到系統環境變量
  7. 重啓Eclipse,運行java工程

JNI系列文章:學習

  1. JNI系列之入門Hello JNI C(一)
  2. JNI系列之入門Hello JNI C(二)
  3. JNI系列入門之C語言與Java的雙向通訊(一)
  4. JNI系列入門之C語言與Java的雙向通訊(二)
  5. JNI系列入門之C語言中文字符串亂碼問題
相關文章
相關標籤/搜索