一、JNI(Java Native Interface)
從圖一(圖片均為盜用)中可以看到Android上層的Application和ApplicationFramework都是使用Java編寫,底層包括系統和使用眾多的Libraries都是C/C++編寫的。Dalvik VM(Dalvik本質上是一個針對低內存耗用而優化的Java虛擬機,允許運行多個VM實例,利用linux實現安全性和進程隔離)編譯是google的Java實現,針對移動設備進行了優化,Dalvik VM運行.dex文件,編譯時會將標準的.class和.jar文件轉換為.dex文件。.dex文件比java類文件更加緊湊、高效。本質上JNI為上層直接調用底層的C/C++函數庫。
下面將學習Android是如何通過Jni來實現Java對C/C++函數的調用
1、什么是JNI:
JNI(Java Native Interface):java本地開發接口
JNI是一個本地調用協議,這個協議用來溝通java代碼和外部的本地代碼(c/c++)
外部的c/c++代碼也可以調用java代碼(相互之間的通信)
2、使用JNI的優點:
效率上 C/C++是本地語言,比java更高效
代碼移植,如果之前用C語言開發過模塊,可以復用已經存在的c代碼
java反編譯比C語言容易,一般加密算法都是用C語言編寫,不容易被反編譯
3、Java基本數據類型與C語言基本數據類型的對應(圖二)
4、引用類型對應(圖三)
5、堆內存和棧內存的概念
棧內存:系統自動分配和釋放,保存全局、靜態、局部變量,在站上分配內存叫靜態分配,大小一般是固定的
堆內存:程序員手動分配(malloc/new)和釋放(free/java不用手動釋放,由GC回收),在堆上分配內存叫動態分配,一般硬件內存有多大堆內存就有多大