首先咱們要理解兩個概念:android
1.Android應用層的JAVA代碼並非運行在硬件上,而是運行在Dalvik虛擬機上面,運行在虛擬機上的代碼不能直接訪問本地環境。函數
2.opengl做爲本地系統庫,運行在本地環境。對象
android應用層的代碼運行環境和opengl運行的環境不一樣。那麼他們怎麼通訊呢?有兩種技術。第一種是使用NDK,當咱們調用Android上面OpenGL的函數的時候,實際上就是在使用NDK調用本地系統庫中的opengl,只是這些都被封裝好了。第二種技術就是改變內存分配的方式,JAVA有一個特殊的類集合,它們能夠分配本地環境的內存塊,而且把JAVA的數據複製到本地環境的內存中。內存
咱們這裏講一講第二種技術方案。隆重介紹ByteBuffer,對,就是它,還有它的兄弟類FloatBuffer,DoubleBuffer等幾個類,這幾個類的對象都是經過ByteBuffer的asFloatBuffer(), asDoubleBuffer()等幾個函數得到,它們使用ByteBuffer的allocateDirect分配的內存。這裏舉例說明。虛擬機
float[] point = {5, 5};//定義一個float類型的頂點垃圾回收
int bytesPerFloat = 4; //每個float數據佔用四個字節硬件
//一個float類型的頂點所佔用的字節總數
int byteSize = point.length * bytesPerFloat;
//分配本地環境的內存,這塊內存不會被垃圾回收機制給回收
ByteBuffer byteBuffer = ByteBuffer.allocateDirect(byteSize);
//按照本地字節序組織內容
byteBuffer.order(ByteOrder.nativeOrder());
//咱們不想操做單獨的字節,而是想操做浮點數
FloatBuffer floatBuffer = byteBuffer.asFloatBuffer();
//把dalvik虛擬機中的內存複製到本地環境內存中
floatBuffer.put(point);float