#JNI是什麼
>java native interface : java 本地接口
>讓java語言調用底層語言的技術就叫JNI
#JNI有什麼用
>規範,讓java語言和底層的c/c++語言可以互相訪問,互相調用。
>適配器模式,讓java的數據類型和c/c++語言的數據類型可以互相對應。
##應用場景
* 操作硬件(編寫驅動,用java代碼調用底層的c代碼)
> 車載電腦 obd模塊,on board debug
* 效率要求非常高
> 圖形的計算,極品飛車
> c、c++語言效率高,java語言效率低一些
* 不重複發明輪子
> opencv 計算機圖形識別的庫,人臉識別,圖形圖像的處理。 c/c++
> ffmpeg 視頻播放的開源項目 c/c++
> opencore 多媒體播放框架
> opengl 圖形處理的框架
> webkit 瀏覽器解析框架
> 7zip 開源的壓縮算法
* 特殊的業務邏輯
> java代碼反編譯容易,不安全
> c代碼,反編譯後讀起來很困難,安全
> 手機網銀支付模塊
#JNI怎麼用
* 熟悉c/c++語法
* 熟悉JAVA語法
* 熟悉jni的規範
#c語言
編譯工具 gcc
c99標準
devcpp開發工具
##java的數據類型
java語言8大基本類型數據
* byte 8位 1個字節
* short 16位 2個字節
* int 32位 4個字節
* long 64位 8個字節
* double 64位 8個字節
* boolean 8位 1個字節
* char 16位 2個字節
* float 32位 4個字節
##c語言的數據類型
char 的長度爲:1 (跟java不同) 代替byte
int 的長度爲:4 (用0或者非0表示boolean)
float 的長度爲:4
double 的長度爲:8
long 的長度爲:4 (跟java不同)
short 的長度爲:2
long long 的長度:8 (表示java的long)
##輸入輸出函數
System.out.println();
c語言的輸出函數
##\*號的含義
\* 號放在 數據類型的後面 代表的是 int* 數據類型的指針變量類型
\* 號放在 指針變量的前面 *p 代表把p表示地址裏面存放的數據取出來
#指針
什麼是指針:
指針就是一塊內存空間,就是一個內存地址
默認c語言的指針 32位內存空間
0x00000000~ 0xffffffff
#指針和指針變量是兩個不同的概念
* 指針代表的是一塊內存地址
* 指針變量是一個存儲指針的變量,存儲這塊內存地址
#修改交換數據的模板
* 傳遞的應該是要修改變量的內存地址
* 子函數裏面 根據這個內存地址,把這個內存地址裏面的數據給修改了
#java語言的值傳遞和引用傳遞
>準確的講,所有的語言都是值傳遞
>thinking in java
#動態內存分配和靜態內存分配
* 動態 new出來的都是動態的 需要程序員手工的申請,需要手工的釋放,運行在堆裏面。必須由程序員手工的回收,或者垃圾回收器去回收內存空間。大小可以無限大,整個windows操作系統系統的內存。
* 靜態 定義出來的都是靜態的 int i; int j; 運行在棧裏面,後進先出的結構,方法執行完畢,操作系統會自動的回收內存空間。都是有大小限制。
>java代碼 new 對象 創建在堆內存裏面。
Person p = new Person();
在棧內存創建一個指針變量 存放對象引用(地址)
在堆內存創建一個對象 person
垃圾回收器 會回收沒有引用的對象。
>c代碼
malloc()
realloc()
free()