Android skia 简单应用 很简单的Skia 2D图形库的调用。

一、Skia 2D图形库

Skia是Google一个底层的图形、图像、动画、SVG、文本等多方面的图形库,它是Android中图形系统的引擎。 Skia的系统库为libskia.so、libskiagl.so(不同版本名称可能有出入)。而libjnigraphics.so图形库由于和其密切相关,一般会一同调用。 二、开始 Skia 工程 1 )Java 外壳
        
  1. publicclassSkiaViewextendsView{
  2. /**TAG标识*/
  3. privatestaticfinalStringTAG="SkiaView";
  4. /**载入动态库*/
  5. static{
  6. try{
  7. System.loadLibrary("SkiaJni");
  8. }catch(UnsatisfiedLinkErrore){
  9. Log.e(TAG,"Couldn'tloadnativelibs");
  10. e.printStackTrace();
  11. }
  12. }
  13. publicSkiaView(Contextcontext){
  14. super(context);
  15. }
  16. @Override
  17. protectedvoidonDraw(Canvascanvas){
  18. super.onDraw(canvas);
  19. Log.i(TAG,"==drawstart==");
  20. //调用本地方法
  21. native_renderCanvas(canvas);
  22. Log.i(TAG,"==drawend==");
  23. }
  24. /**本地渲染画布方法*/
  25. privatenativevoidnative_renderCanvas(Canvascanvas);
  26. }
2 )C/C++ 封装 2.1)我的环境 XP+Eclipse+Cygwin。并需要准备源码,这里是2.3.3_r1。 准备源码,可参见《 ubuntu 11.10下载和编译Android源码》。 2.2)建立工程

1. 工程地址:AndroidSkia工程根目录jni文件夹。

2. Build command:bash --login -c "cd $WORKSPACE/AndroidSkia && $NDKROOT/ndk-build"

$WORKSPACE、$NDKROOT为工作空间、NDK路径。在Cygwin根目录\home\[your name]\ .bash_profile文件内配置。

3.includes jni、skia等需要的头文件。当前如下:

skia

详细方式,参见《 Android NDK基础样例》。 2.3)Android.mk
        
  1. LOCAL_PATH:=$(callmy-dir)
  2. include$(CLEAR_VARS)
  3. MY_ANDROID_SOURCE=F:/01.软件/01.开发/05.android/android_sys_src/2.3.3_r1
  4. MY_ANDROID_SYSLIB=$(MY_ANDROID_SOURCE)/out/target/product/generic/system/lib
  5. #也可以在cygwin\home\Join\.bash_profile文件内配置,如下:
  6. #exportMY_ANDROID_SOURCE="/cygdrive/f/..."
  7. #exportMY_ANDROID_SYSLIB="/cygdrive/f/..."
  8. LOCAL_MODULE:=libSkiaJni
  9. LOCAL_SRC_FILES:=\
  10. jniLoad.cpp\
  11. org_join_skia_SkiaView.cpp
  12. LOCAL_C_INCLUDES:=\
  13. $(MY_ANDROID_SOURCE)/dalvik/libnativehelper/include/nativehelper\
  14. $(MY_ANDROID_SOURCE)/frameworks/base/include\
  15. $(MY_ANDROID_SOURCE)/system/core/include\
  16. $(MY_ANDROID_SOURCE)/frameworks/base/native/include\
  17. $(MY_ANDROID_SOURCE)/frameworks/base/core/jni/android/graphics\
  18. $(MY_ANDROID_SOURCE)/external/skia/include/core\
  19. $(MY_ANDROID_SOURCE)/external/skia/include/config\
  20. $(MY_ANDROID_SOURCE)/external/skia/include/images
  21. #同时在工程Properties->C/C++General->PathsandSymbols属性内include相应文件目录
  22. #否则编程时找不到.h文件,不便写代码,但不会影响编译。而LOCAL_LDLIBS/LOCAL_LDFLAGS必需添加。
  23. #LOCAL_LDLIBS:=-L$(MY_ANDROID_SYSLIB)-llog-ljnigraphics-lskia-landroid_runtime
  24. #也可以用以下方式指定so库
  25. LOCAL_LDFLAGS:=\
  26. $(MY_ANDROID_SYSLIB)/liblog.so\
  27. $(MY_ANDROID_SYSLIB)/libjnigraphics.so\
  28. $(MY_ANDROID_SYSLIB)/libskia.so\
  29. $(MY_ANDROID_SYSLIB)/libskiagl.so\
  30. $(MY_ANDROID_SYSLIB)/libandroid_runtime.so
  31. include$(BUILD_SHARED_LIBRARY)
LOCAL_C_INCLUDES的头文件路径,第一个是jni的,最后三是lskia的,倒数四是ljnigraphics的,其他为基础的(如llog,除了某一是landroid_runtime的,忘了哪个==)。 MY_ANDROID_SYSLIB也可从模拟器导出。 2.4)org_join_skia_SkiaView.cpp
        
  1. #include"jniLoad.h"
  2. #include<GraphicsJNI.h>
  3. #include<SkCanvas.h>
  4. #include<SkPaint.h>
  5. #include<SkRect.h>
  6. #include<SkColor.h>
  7. #include<SkTypes.h>
  8. #include<SkGraphics.h>
  9. staticvoiddrawFlag(SkCanvas*canv);
  10. staticvoidnative_renderCanvas(JNIEnv*env,jobjectobj,jobjectcanvas){
  11. MY_LOGI("==cmethodstart==");
  12. SkCanvas*canv=GraphicsJNI::getNativeCanvas(env,canvas);
  13. if(!canv){
  14. MY_LOGE("==canvisNULL==");
  15. return;
  16. }
  17. canv->save();
  18. canv->translate(100,100);
  19. drawFlag(canv);
  20. canv->restore();
  21. MY_LOGI("==cmethodend==");
  22. }
  23. /**画旗帜*/
  24. staticvoiddrawFlag(SkCanvas*canv){
  25. SkPaint*paint=newSkPaint();
  26. paint->setFlags(paint->kAntiAlias_Flag);
  27. SkRect*rect=newSkRect();
  28. rect->set(0,0,200,100);
  29. paint->setColor(SK_ColorRED);
  30. canv->drawRect(*rect,*paint);
  31. paint->setColor(SK_ColorGRAY);
  32. paint->setStrokeWidth(10);
  33. canv->drawLine(5,100,5,300,*paint);
  34. paint->setTextSize(30);
  35. paint->setColor(SK_ColorBLUE);
  36. paint->setTextAlign(paint->kCenter_Align);
  37. constchar*text="HelloWorld";
  38. canv->drawText(text,strlen(text),100,60,*paint);
  39. }
  40. /**
  41. *JNIregistration.
  42. */
  43. staticJNINativeMethodmethods[]={{"native_renderCanvas",
  44. "(Landroid/graphics/Canvas;)V",(void*)native_renderCanvas}};
  45. intregister_org_join_skia_SkiaView(JNIEnv*env){
  46. returnjniRegisterNativeMethods(env,"org/join/skia/SkiaView",methods,
  47. sizeof(methods)/sizeof(methods[0]));
  48. }
2.5)jniLoad.h
        
  1. #ifndefJNILOAD_H_
  2. #defineJNILOAD_H_
  3. #include<jni.h>
  4. #include<utils/Log.h>
  5. #defineMY_LOG_TAG"JNI_LOG"
  6. #defineMY_LOGI(...)__android_log_print(ANDROID_LOG_INFO,MY_LOG_TAG,__VA_ARGS__)
  7. #defineMY_LOGE(...)__android_log_print(ANDROID_LOG_ERROR,MY_LOG_TAG,__VA_ARGS__)
  8. #ifdef__cplusplus
  9. extern"C"{
  10. #endif
  11. intjniRegisterNativeMethods(JNIEnv*env,constchar*className,
  12. constJNINativeMethod*gMethods,intnumMethods);
  13. #ifdef__cplusplus
  14. }
  15. #endif
  16. #endif/*JNILOAD_H_*/
2.6)jniLoad.cpp
        
  1. #include"jniLoad.h"
  2. #include<stdlib.h>
  3. intregister_org_join_skia_SkiaView(JNIEnv*env);
  4. intjniRegisterNativeMethods(JNIEnv*env,constchar*className,
  5. constJNINativeMethod*gMethods,intnumMethods){
  6. jclassclazz;
  7. MY_LOGI("Registering%snatives\n",className);
  8. clazz=env->FindClass(className);
  9. if(clazz==NULL){
  10. MY_LOGE("Nativeregistrationunabletofindclass'%s'\n",className);
  11. returnJNI_ERR;
  12. }
  13. if(env->RegisterNatives(clazz,gMethods,numMethods)<0){
  14. MY_LOGE("RegisterNativesfailedfor'%s'\n",className);
  15. returnJNI_ERR;
  16. }
  17. returnJNI_OK;
  18. }
  19. jintJNI_OnLoad(JavaVM*vm,void*reserved){
  20. JNIEnv*env=NULL;
  21. jintresult=JNI_ERR;
  22. if(vm->GetEnv((void**)&env,JNI_VERSION_1_4)!=JNI_OK){
  23. MY_LOGE("GetEnvfailed!");
  24. returnresult;
  25. }
  26. MY_LOGI("loading...");
  27. if(register_org_join_skia_SkiaView(env)!=JNI_OK){
  28. MY_LOGE("can'tloadorg_join_skia_SkiaView");
  29. gotoend;
  30. }
  31. /**
  32. *registerothers
  33. */
  34. MY_LOGI("loaded");
  35. result=JNI_VERSION_1_4;
  36. end:
  37. returnresult;
  38. }
3 )运行效果

skia

三、 Cygwin 问题 使用Cygwin时可能遇到的问题,之前都没提到过,现在补上==。

1)make 3.81 bug - error: multiple target patterns. Stop.

http://cygwin.com/ml/cygwin/2009-04/msg00007.html 下载http://www.cmake.org/files/cygwin/make.exe替换原来的make.exe 2)添加当前工程下的头文件和库文件

添加include路径:project->properties->c/c++ build->settings->cygwin c compiler->includes->include paths->"${workspace_loc:/${ProjName}}"

添加链接库:同上,在cygwin c linker->libraries下添加。

3)cygwin warning: MS-DOS style path detected:...

添加环境变量CYGWIN=nodosfilewarning,可取消报警。 四、后记 附件工程!

更多相关文章

  1. Android的编译时遇到 gcc: error trying to exec 'cc1plus': exe
  2. android studio 打开工程报错
  3. android java Socket多文件发送
  4. Android 交叉编译 Linux 可执行文件
  5. Android 工程中的 R.java 文件丢失后如何重新生成
  6. 【Android Developers Training】 25. 保存文件

随机推荐

  1. Android(安卓)组件系列-----Activity的传
  2. android button的美化
  3. Robolectric使用(一)简单使用
  4. 第一个变化———由support库到Androidx
  5. EditText焦点控制及软键盘的隐藏显示
  6. BLE 扫描及连接 android程序开发(一)
  7. 活用Android的Message Queue(1)
  8. ANDROID JNI的使用简介
  9. Android照相机应用
  10. 在官网途径无法下载到android 源码时,,你可