自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

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

以圖形庫(kù)skia為例,具體過(guò)程如下:

1、建立完整的android開(kāi)發(fā)環(huán)境,JAVA層的環(huán)境SDK、JDK、eclipse都要裝,C&C++層的環(huán)境NDK、cygwin、git也都要裝好。

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

3、通過(guò)git下載android源碼:xxxx/core,xxxx/base,xxxx/skia三個(gè)文件夾就夠了。(找到android源碼git文件的下載列表,搜索頁(yè)面就可以了,都下載,都下載?。。?/p>

4、編譯skia文件夾,獲得skia對(duì)應(yīng)的so文件。

4.1 如果你的skia文件夾來(lái)自skia官網(wǎng),那就看看目錄下的config文件,編寫(xiě)你的make.out文件,之后編譯,出錯(cuò),再編譯,再出錯(cuò)。。。是因?yàn)槿鄙兕^文件,對(duì)吧?,這些頭文件與硬件或圖像編碼有關(guān),比如說(shuō)atomic.h啊png.h啊什么的。找吧!!補(bǔ)上??!還是報(bào)錯(cuò)的話(huà),就是因?yàn)檫€缺少某些定義,報(bào)錯(cuò)一大推“undeclared”,找不到就只能自己寫(xiě),當(dāng)然前提是你對(duì)你的開(kāi)發(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里編寫(xiě)你的cpp文件。(重要提示:你可以不仔細(xì)看我寫(xiě)的東西,但如果你是在沒(méi)有仔細(xì)看NDK自帶doc文件夾里那十幾篇英文參考的情況下這么做,那你一定會(huì)生不如死的)

6、搜索skia文件,找到skcanvas.h,看看我們能用skia干什么。和android相比,skia的自述文件儼然像是個(gè)天使。不理解什么是天使?請(qǐng)參看android NDK下的文檔。

7、以畫(huà)畫(huà)寫(xiě)字為例,我的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、編寫(xiě)android.mk和appliction文件,具體怎么寫(xiě),直接拷貝NDK下sample里的同名文件,再修改一下就可以了。具體怎么改。。。兄弟!不是我蒙你,還是看看NDK下的自述文檔吧,我收回在第5步所說(shuō)的話(huà)。用NDK文件夾下的ndk-build編譯,根據(jù)出錯(cuò)信息關(guān)聯(lián)所需頭文件,都在你之前下載的幾個(gè)文件夾里了,真的。編譯成功,會(huì)在lib文件夾得到新的so文件。(重要提示:mk文件中記得帶上-lskia,-lskiagl,-ljnigraphics)

9、編寫(xiě)JAVA程序調(diào)用上面的函數(shù)。該怎么寫(xiě)呢? 打開(kāi)eclipse,新建工程,在程序中先Loadlibrary,再native C申明,具體。。。網(wǎng)上搜吧,要么就看看NDK下面sample里隨便哪個(gè)例子,那個(gè)plasma就不錯(cuò)

10、運(yùn)行ecplise里的項(xiàng)目,之前先看看有沒(méi)有把so文件放到項(xiàng)目所在地的lib中。

11、下載到真機(jī)上運(yùn)行,較低版本的機(jī)器,會(huì)缺少libjnipraphics.so庫(kù),需要在apk中添加。

【編輯推薦】

Android布局屬性詳解

Android 多任務(wù)多線(xiàn)程斷點(diǎn)下載

Android Activity和Intent機(jī)制學(xué)習(xí)筆記

Android應(yīng)用——Activity傳參數(shù)與跳轉(zhuǎn)

升級(jí)到Android 2.3.4,體驗(yàn)***的Android技術(shù)

責(zé)任編輯:zhaolei 來(lái)源: 互聯(lián)網(wǎng)
相關(guān)推薦

2014-06-19 10:59:10

AndroidEclipse公共庫(kù)

2017-03-31 09:35:14

Android函數(shù)Android庫(kù)

2016-11-29 10:49:29

Android

2015-11-04 11:17:10

移動(dòng)開(kāi)發(fā)圖片格式

2009-08-13 18:36:36

C#繼承構(gòu)造函數(shù)

2022-12-09 15:34:38

2021-03-03 08:02:13

JavaScript函數(shù)字節(jié)

2010-04-27 09:55:15

2017-01-03 15:23:56

Android動(dòng)態(tài)加載SO庫(kù)

2011-06-22 14:07:42

Lua

2011-05-05 14:24:02

Android NDKAndroid NDKNDK

2011-09-09 16:19:40

Android Web

2022-05-05 09:02:24

Go函數(shù)調(diào)用棧

2014-07-01 11:31:35

NDKSO庫(kù)JNI調(diào)用

2022-06-07 15:33:51

Android優(yōu)化實(shí)踐

2011-08-10 17:00:45

DB2數(shù)據(jù)庫(kù)存儲(chǔ)過(guò)程

2011-08-22 14:00:13

SQL Server 游標(biāo)調(diào)用函數(shù)

2023-10-26 11:37:35

函數(shù)Python

2017-07-27 15:52:10

函數(shù)調(diào)用堆棧結(jié)構(gòu)

2012-03-27 10:08:08

JavaScript
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)