0918340  

以圖形庫skia為例,具體過程如下:

 

1、建立完整的android開發環境,JAVA層的環境SDK、JDK、eclipse都要裝,C&C++層的環境NDK、cygwin、git也都要裝好。

 

2、下載完整的skia代碼,代碼自己到google上搜吧(重要提示:wiki,TortoiseSVN)

 

3、通過git下載android源碼:xxxx/core,xxxx/base,xxxx/skia三個資料夾就夠了。(找到android源碼git檔的下載清單,搜尋網頁面就可以了,都下載,都下載!!

 

4、編譯skia資料夾,獲得skia對應的so檔。

 

4.1 如果你的skia資料夾來自skia官網,那就看看目錄下的config檔,編寫你的make.out檔,之後編譯,出錯,再編譯,再出錯。。。是因為缺少標頭檔,對吧?,這些標頭檔與硬體或圖像編碼有關,比如說atomic.h啊png.h啊什麼的。找吧!!補上!!還是報錯的話,就是因為還缺少某些定義,報錯一大推「undeclared」,找不到就只能自己寫,當然前提是你對你的開發板足夠熟悉,比如skia要求mutex的申明,並實現這個自旋鎖的佔用和釋放介面。(本步驟可以省略)

 

4.2 在ndk資料夾裡搜索,獲得libskia.so, libskiagl.so, libjnigraphics.so

 

5、新建專案資料夾,把第三步的core,base,skia三個資料夾扔進去。在專案資料夾裡新建個lib資料夾,把第四步生成的so檔扔到lib裡。新建jni資料夾,在jni裡編寫你的cpp檔。(重要提示:你可以不仔細看我寫的東西,但如果你是在沒有仔細看NDK自帶doc資料夾裡那十幾篇英文參考的情況下這麼做,那你一定會生不如死的)

 

6、搜索skia檔,找到skcanvas.h,看看我們能用skia幹什麼。和android相比,skia的讀我檔案儼然像是個天使。不理解什麼是天使?請參看android NDK下的文檔。

 

7、以畫畫寫字為例,我的cpp檔如下:

 

  1. #include <jni.h> 
  2. #include <time.h> 
  3. #include <android\log.h> 
  4. #include <android\bitmap.h> 
  5. #include <pthread.h> 
  6. #include <stdio.h> 
  7. #include <stdlib.h> 
  8. #include <math.h> 
  9. #include "SkBitmap.h"  
  10. #include "SkDevice.h"  
  11. #include "SkPaint.h"  
  12. #include "SkRect.h"  
  13. #include "SkImageEncoder.h"  
  14. extern "C"  
  15. {  
  16. JNIEXPORT jint JNICALL Java_JNItestForGraph_JNItestForGraph_TestBackView_changeback  
  17.   (JNIEnv * env, jobject  obj, jobject bitmap, jint time);  
  18. }  
  19. JNIEXPORT jint JNICALL Java_JNItestForGraph_JNItestForGraph_TestBackView_changeback  
  20.     (JNIEnv * env, jobject  obj, jobject bitmap, jint time)  
  21. {  
  22.                  AndroidBitmapInfo  info;  
  23.              int*              pixels;  
  24.                 int ret;  
  25.                 ret = AndroidBitmap_getInfo(env, bitmap, &info);  
  26.                 ret = AndroidBitmap_lockPixels(env, bitmap, (void**)&pixels);  
  27.                 int width=(int)info.width;  
  28.                 int height=(int)info.height;  
  29.           
  30.                 SkBitmap bmp = SkBitmap();  
  31.                 bmp.setConfig(SkBitmap::kARGB_8888_Config,width,height,0);  
  32.                 bmp.setPixels((void*)pixels);  
  33.                 SkCanvas backgroud(bmp);  
  34.                 SkPaint paint;  
  35.                     paint.setARGB(255, 255, 0, 0);  
  36.                 SkRect r;  
  37.                 r.set(25, 25, 145, 145);  
  38.                 backgroud.drawRect(r, paint);  
  39.                 AndroidBitmap_unlockPixels(env, bitmap);  
  40.                 backgroud.drawRect(r, paint);  
  41.                 paint.setARGB(255, 0, 255, 0);  
  42.                     r.offset(20, 20);  
  43.                     backgroud.drawRect(r, paint);  
  44.                     paint.setARGB(255, 0, 0, 255);  
  45.                     r.offset(20, 20);  
  46.                     backgroud.drawRect(r, paint);  
  47.                 paint.setARGB(255, 0, 0, 0);  
  48.                 backgroud.drawText("ABCD", 4*sizeof(char), 0, 100 , paint);  
  49.                 return (ret);  
重要提示:檔案名的命名很有講究,網上搜搜NDK native C或好好看看NDK自述文檔HOWTO.TXT)

 

8、編寫android.mk和appliction檔,具體怎麼寫,直接拷貝NDK下sample裡的同名檔,再修改一下就可以了。具體怎麼改。。。兄弟!不是我蒙你,還是看看NDK下的自述文檔吧,我收回在第5步所說的話。用NDK資料夾下的ndk-build編譯,根據出錯資訊關聯所需標頭檔,都在你之前下載的幾個資料夾裡了,真的。編譯成功,會在lib資料夾得到新的so檔。(重要提示:mk檔中記得帶上-lskia,-lskiagl,-ljnigraphics)

 

9、編寫JAVA程式調用上面的函數。該怎麼寫呢? 打開eclipse,新建工程,在程式中先Loadlibrary,再native C申明,具體。。。網上搜吧,要麼就看看NDK下面sample裡隨便哪個例子,那個plasma就不錯

 

10、運行ecplise裡的專案,之前先看看有沒有把so檔放到專案所在地的lib中。

 

11、下載到真機上運行,較低版本的機器,會缺少libjnipraphics.so庫,需要在apk中添加。
 
來源:
http://www.360doc.com/content/13/0401/17/7891085_275332788.shtml
arrow
arrow
    全站熱搜

    戮克 發表在 痞客邦 留言(0) 人氣()