以圖形庫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檔如下:
- #include <jni.h>
- #include <time.h>
- #include <android\log.h>
- #include <android\bitmap.h>
- #include <pthread.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <math.h>
- #include "SkBitmap.h"
- #include "SkDevice.h"
- #include "SkPaint.h"
- #include "SkRect.h"
- #include "SkImageEncoder.h"
- extern "C"
- {
- JNIEXPORT jint JNICALL Java_JNItestForGraph_JNItestForGraph_TestBackView_changeback
- (JNIEnv * env, jobject obj, jobject bitmap, jint time);
- }
- JNIEXPORT jint JNICALL Java_JNItestForGraph_JNItestForGraph_TestBackView_changeback
- (JNIEnv * env, jobject obj, jobject bitmap, jint time)
- {
- AndroidBitmapInfo info;
- int* pixels;
- int ret;
- ret = AndroidBitmap_getInfo(env, bitmap, &info);
- ret = AndroidBitmap_lockPixels(env, bitmap, (void**)&pixels);
- int width=(int)info.width;
- int height=(int)info.height;
- SkBitmap bmp = SkBitmap();
- bmp.setConfig(SkBitmap::kARGB_8888_Config,width,height,0);
- bmp.setPixels((void*)pixels);
- SkCanvas backgroud(bmp);
- SkPaint paint;
- paint.setARGB(255, 255, 0, 0);
- SkRect r;
- r.set(25, 25, 145, 145);
- backgroud.drawRect(r, paint);
- AndroidBitmap_unlockPixels(env, bitmap);
- backgroud.drawRect(r, paint);
- paint.setARGB(255, 0, 255, 0);
- r.offset(20, 20);
- backgroud.drawRect(r, paint);
- paint.setARGB(255, 0, 0, 255);
- r.offset(20, 20);
- backgroud.drawRect(r, paint);
- paint.setARGB(255, 0, 0, 0);
- backgroud.drawText("ABCD", 4*sizeof(char), 0, 100 , paint);
- 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
全站熱搜
留言列表