一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

Android庫so文件及skia函數(shù)的調(diào)用

 mandrave 2013-04-01

為了實(shí)現(xiàn)Android的二次開發(fā),希望通過編制動(dòng)態(tài)鏈接庫(.so)的方式實(shí)現(xiàn)android native C程序的調(diào)用。更為實(shí)際的情況則是:編制新庫(new.so)調(diào)用android的老庫(如libskia.so libskiagl.so)


以圖形庫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文件如下:

  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);  

(重要提示:文件名的命名很有講究,網(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中添加。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    亚洲精选91福利在线观看| 草草夜色精品国产噜噜竹菊| 日本 一区二区 在线| 国产专区亚洲专区久久| 亚洲精品深夜福利视频| 欧美亚洲三级视频在线观看| 亚洲欧美中文日韩综合| 国产av精品一区二区| 久久人人爽人人爽大片av| 国产精品一区二区视频大全| 日韩高清中文字幕亚洲| 欧美一区二区三区高潮菊竹| 亚洲av专区在线观看| 美女被后入视频在线观看| 真实国产乱子伦对白视频不卡| 二区久久久国产av色| 国产精品成人一区二区三区夜夜夜| 亚洲品质一区二区三区| 亚洲午夜av久久久精品| 日韩aa一区二区三区| 久久精视频免费视频观看| 五月婷婷缴情七月丁香| 嫩草国产福利视频一区二区| 国产大屁股喷水在线观看视频 | 在线观看视频国产你懂的| 久久精品国产在热亚洲| 国产亚洲欧美日韩精品一区 | 高清免费在线不卡视频| 精品少妇人妻av一区二区蜜桃| 91人妻人人做人碰人人九色| 国产精品一区二区丝袜| 福利视频一区二区在线| 免费大片黄在线观看日本| 日本深夜福利在线播放| 亚洲天堂精品在线视频| 日本av在线不卡一区| 欧美野外在线刺激在线观看| 老司机激情五月天在线不卡| 夫妻性生活动态图视频| 国产成人亚洲精品青草天美| 成年人视频日本大香蕉久久|