以圖形庫skia為例,具體過程如下:
1、建立完整的android開發(fā)環(huán)境,JAVA層的環(huán)境SDK、JDK、eclipse都要裝,C&C++層的環(huán)境NDK、cygwin、git也都要裝好。
2、下載完整的skia代碼,代碼自己到google上搜吧(重要提示:wiki,TortoiseSVN)
3、通過git下載android源碼:xxxx/core,xxxx/base,xxxx/skia三個(gè)文件夾就夠了。(找到android源碼git文件的下載列表,搜索頁面就可以了,都下載,都下載!?。?/p>
4、編譯skia文件夾,獲得skia對(duì)應(yīng)的so文件。
4.1 如果你的skia文件夾來自skia官網(wǎng),那就看看目錄下的config文件,編寫你的make.out文件,之后編譯,出錯(cuò),再編譯,再出錯(cuò)。。。是因?yàn)槿鄙兕^文件,對(duì)吧?,這些頭文件與硬件或圖像編碼有關(guān),比如說atomic.h啊png.h啊什么的。找吧?。⊙a(bǔ)上??!還是報(bào)錯(cuò)的話,就是因?yàn)檫€缺少某些定義,報(bào)錯(cuò)一大推“undeclared”,找不到就只能自己寫,當(dāng)然前提是你對(duì)你的開發(fā)板足夠熟悉,比如skia要求mutex的申明,并實(shí)現(xiàn)這個(gè)自旋鎖的占用和釋放接口。(本步驟可以省略)
4.2 在ndk文件夾里搜索,獲得libskia.so, libskiagl.so, libjnigraphics.so
5、新建項(xiàng)目文件夾,把第三步的core,base,skia三個(gè)文件夾扔進(jìn)去。在項(xiàng)目文件夾里新建個(gè)lib文件夾,把第四步生成的so文件扔到lib里。新建jni文件夾,在jni里編寫你的cpp文件。(重要提示:你可以不仔細(xì)看我寫的東西,但如果你是在沒有仔細(xì)看NDK自帶doc文件夾里那十幾篇英文參考的情況下這么做,那你一定會(huì)生不如死的)
6、搜索skia文件,找到skcanvas.h,看看我們能用skia干什么。和android相比,skia的自述文件儼然像是個(gè)天使。不理解什么是天使?請(qǐng)參看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);
- }
(重要提示:文件名的命名很有講究,網(wǎng)上搜搜NDK native C或好好看看NDK自述文檔HOWTO.TXT)
8、編寫android.mk和appliction文件,具體怎么寫,直接拷貝NDK下sample里的同名文件,再修改一下就可以了。具體怎么改。。。兄弟!不是我蒙你,還是看看NDK下的自述文檔吧,我收回在第5步所說的話。用NDK文件夾下的ndk-build編譯,根據(jù)出錯(cuò)信息關(guān)聯(lián)所需頭文件,都在你之前下載的幾個(gè)文件夾里了,真的。編譯成功,會(huì)在lib文件夾得到新的so文件。(重要提示:mk文件中記得帶上-lskia,-lskiagl,-ljnigraphics)
9、編寫JAVA程序調(diào)用上面的函數(shù)。該怎么寫呢? 打開eclipse,新建工程,在程序中先Loadlibrary,再native C申明,具體。。。網(wǎng)上搜吧,要么就看看NDK下面sample里隨便哪個(gè)例子,那個(gè)plasma就不錯(cuò)
10、運(yùn)行ecplise里的項(xiàng)目,之前先看看有沒有把so文件放到項(xiàng)目所在地的lib中。
11、下載到真機(jī)上運(yùn)行,較低版本的機(jī)器,會(huì)缺少libjnipraphics.so庫,需要在apk中添加。