Android库so文件及skia函数的调用

移动开发 Android
为了实现Android的二次开发,希望通过编制动态链接库(.so)的方式实现android native C程序的调用。更为实际的情况则是:编制新库(new.so)调用android的老库(如libskia.so libskiagl.so)

以图形库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中添加。

【编辑推荐】

Android布局属性详解

Android 多任务多线程断点下载

Android Activity和Intent机制学习笔记

Android应用——Activity传参数与跳转

升级到Android 2.3.4,体验***的Android技术

责任编辑:zhaolei 来源: 互联网
相关推荐

2014-06-19 10:59:10

AndroidEclipse公共库

2017-03-31 09:35:14

Android函数Android库

2016-11-29 10:49:29

Android

2015-11-04 11:17:10

移动开发图片格式

2009-08-13 18:36:36

C#继承构造函数

2022-12-09 15:34:38

2021-03-03 08:02:13

JavaScript函数字节

2017-01-03 15:23:56

Android动态加载SO库

2010-04-27 09:55:15

2022-05-05 09:02:24

Go函数调用栈

2011-05-05 14:24:02

Android NDKAndroid NDKNDK

2011-09-09 16:19:40

Android Web

2011-06-22 14:07:42

Lua

2014-07-01 11:31:35

NDKSO库JNI调用

2011-08-10 17:00:45

DB2数据库存储过程

2010-09-10 16:02:13

SQLCHARINDEX函数

2012-03-27 10:08:08

JavaScript

2011-08-25 16:47:53

LuaC++ 证书

2011-08-22 14:00:13

SQL Server 游标调用函数

2022-06-07 15:33:51

Android优化实践
点赞
收藏

51CTO技术栈公众号