Android skia简单应用
16lz
2021-01-23
Android skia 简单应用 很简单的Skia 2D图形库的调用。
一、Skia 2D图形库
Skia是Google一个底层的图形、图像、动画、SVG、文本等多方面的图形库,它是Android中图形系统的引擎。 Skia的系统库为libskia.so、libskiagl.so(不同版本名称可能有出入)。而libjnigraphics.so图形库由于和其密切相关,一般会一同调用。 二、开始 Skia 工程 1 )Java 外壳2 )C/C++ 封装 2.1)我的环境 XP+Eclipse+Cygwin。并需要准备源码,这里是2.3.3_r1。 准备源码,可参见《 ubuntu 11.10下载和编译Android源码》。 2.2)建立工程
- publicclassSkiaViewextendsView{
- /**TAG标识*/
- privatestaticfinalStringTAG="SkiaView";
- /**载入动态库*/
- static{
- try{
- System.loadLibrary("SkiaJni");
- }catch(UnsatisfiedLinkErrore){
- Log.e(TAG,"Couldn'tloadnativelibs");
- e.printStackTrace();
- }
- }
- publicSkiaView(Contextcontext){
- super(context);
- }
- @Override
- protectedvoidonDraw(Canvascanvas){
- super.onDraw(canvas);
- Log.i(TAG,"==drawstart==");
- //调用本地方法
- native_renderCanvas(canvas);
- Log.i(TAG,"==drawend==");
- }
- /**本地渲染画布方法*/
- privatenativevoidnative_renderCanvas(Canvascanvas);
- }
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等需要的头文件。当前如下:
详细方式,参见《 Android NDK基础样例》。 2.3)Android.mkLOCAL_C_INCLUDES的头文件路径,第一个是jni的,最后三是lskia的,倒数四是ljnigraphics的,其他为基础的(如llog,除了某一是landroid_runtime的,忘了哪个==)。 MY_ANDROID_SYSLIB也可从模拟器导出。 2.4)org_join_skia_SkiaView.cpp
- LOCAL_PATH:=$(callmy-dir)
- include$(CLEAR_VARS)
- MY_ANDROID_SOURCE=F:/01.软件/01.开发/05.android/android_sys_src/2.3.3_r1
- MY_ANDROID_SYSLIB=$(MY_ANDROID_SOURCE)/out/target/product/generic/system/lib
- #也可以在cygwin\home\Join\.bash_profile文件内配置,如下:
- #exportMY_ANDROID_SOURCE="/cygdrive/f/..."
- #exportMY_ANDROID_SYSLIB="/cygdrive/f/..."
- LOCAL_MODULE:=libSkiaJni
- LOCAL_SRC_FILES:=\
- jniLoad.cpp\
- org_join_skia_SkiaView.cpp
- LOCAL_C_INCLUDES:=\
- $(MY_ANDROID_SOURCE)/dalvik/libnativehelper/include/nativehelper\
- $(MY_ANDROID_SOURCE)/frameworks/base/include\
- $(MY_ANDROID_SOURCE)/system/core/include\
- $(MY_ANDROID_SOURCE)/frameworks/base/native/include\
- $(MY_ANDROID_SOURCE)/frameworks/base/core/jni/android/graphics\
- $(MY_ANDROID_SOURCE)/external/skia/include/core\
- $(MY_ANDROID_SOURCE)/external/skia/include/config\
- $(MY_ANDROID_SOURCE)/external/skia/include/images
- #同时在工程Properties->C/C++General->PathsandSymbols属性内include相应文件目录
- #否则编程时找不到.h文件,不便写代码,但不会影响编译。而LOCAL_LDLIBS/LOCAL_LDFLAGS必需添加。
- #LOCAL_LDLIBS:=-L$(MY_ANDROID_SYSLIB)-llog-ljnigraphics-lskia-landroid_runtime
- #也可以用以下方式指定so库
- LOCAL_LDFLAGS:=\
- $(MY_ANDROID_SYSLIB)/liblog.so\
- $(MY_ANDROID_SYSLIB)/libjnigraphics.so\
- $(MY_ANDROID_SYSLIB)/libskia.so\
- $(MY_ANDROID_SYSLIB)/libskiagl.so\
- $(MY_ANDROID_SYSLIB)/libandroid_runtime.so
- include$(BUILD_SHARED_LIBRARY)
2.5)jniLoad.h
- #include"jniLoad.h"
- #include<GraphicsJNI.h>
- #include<SkCanvas.h>
- #include<SkPaint.h>
- #include<SkRect.h>
- #include<SkColor.h>
- #include<SkTypes.h>
- #include<SkGraphics.h>
- staticvoiddrawFlag(SkCanvas*canv);
- staticvoidnative_renderCanvas(JNIEnv*env,jobjectobj,jobjectcanvas){
- MY_LOGI("==cmethodstart==");
- SkCanvas*canv=GraphicsJNI::getNativeCanvas(env,canvas);
- if(!canv){
- MY_LOGE("==canvisNULL==");
- return;
- }
- canv->save();
- canv->translate(100,100);
- drawFlag(canv);
- canv->restore();
- MY_LOGI("==cmethodend==");
- }
- /**画旗帜*/
- staticvoiddrawFlag(SkCanvas*canv){
- SkPaint*paint=newSkPaint();
- paint->setFlags(paint->kAntiAlias_Flag);
- SkRect*rect=newSkRect();
- rect->set(0,0,200,100);
- paint->setColor(SK_ColorRED);
- canv->drawRect(*rect,*paint);
- paint->setColor(SK_ColorGRAY);
- paint->setStrokeWidth(10);
- canv->drawLine(5,100,5,300,*paint);
- paint->setTextSize(30);
- paint->setColor(SK_ColorBLUE);
- paint->setTextAlign(paint->kCenter_Align);
- constchar*text="HelloWorld";
- canv->drawText(text,strlen(text),100,60,*paint);
- }
- /**
- *JNIregistration.
- */
- staticJNINativeMethodmethods[]={{"native_renderCanvas",
- "(Landroid/graphics/Canvas;)V",(void*)native_renderCanvas}};
- intregister_org_join_skia_SkiaView(JNIEnv*env){
- returnjniRegisterNativeMethods(env,"org/join/skia/SkiaView",methods,
- sizeof(methods)/sizeof(methods[0]));
- }
2.6)jniLoad.cpp
- #ifndefJNILOAD_H_
- #defineJNILOAD_H_
- #include<jni.h>
- #include<utils/Log.h>
- #defineMY_LOG_TAG"JNI_LOG"
- #defineMY_LOGI(...)__android_log_print(ANDROID_LOG_INFO,MY_LOG_TAG,__VA_ARGS__)
- #defineMY_LOGE(...)__android_log_print(ANDROID_LOG_ERROR,MY_LOG_TAG,__VA_ARGS__)
- #ifdef__cplusplus
- extern"C"{
- #endif
- intjniRegisterNativeMethods(JNIEnv*env,constchar*className,
- constJNINativeMethod*gMethods,intnumMethods);
- #ifdef__cplusplus
- }
- #endif
- #endif/*JNILOAD_H_*/
3 )运行效果
- #include"jniLoad.h"
- #include<stdlib.h>
- intregister_org_join_skia_SkiaView(JNIEnv*env);
- intjniRegisterNativeMethods(JNIEnv*env,constchar*className,
- constJNINativeMethod*gMethods,intnumMethods){
- jclassclazz;
- MY_LOGI("Registering%snatives\n",className);
- clazz=env->FindClass(className);
- if(clazz==NULL){
- MY_LOGE("Nativeregistrationunabletofindclass'%s'\n",className);
- returnJNI_ERR;
- }
- if(env->RegisterNatives(clazz,gMethods,numMethods)<0){
- MY_LOGE("RegisterNativesfailedfor'%s'\n",className);
- returnJNI_ERR;
- }
- returnJNI_OK;
- }
- jintJNI_OnLoad(JavaVM*vm,void*reserved){
- JNIEnv*env=NULL;
- jintresult=JNI_ERR;
- if(vm->GetEnv((void**)&env,JNI_VERSION_1_4)!=JNI_OK){
- MY_LOGE("GetEnvfailed!");
- returnresult;
- }
- MY_LOGI("loading...");
- if(register_org_join_skia_SkiaView(env)!=JNI_OK){
- MY_LOGE("can'tloadorg_join_skia_SkiaView");
- gotoend;
- }
- /**
- *registerothers
- */
- MY_LOGI("loaded");
- result=JNI_VERSION_1_4;
- end:
- returnresult;
- }
三、 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,可取消报警。 四、后记 附件工程!更多相关文章
- Android的编译时遇到 gcc: error trying to exec 'cc1plus': exe
- android studio 打开工程报错
- android java Socket多文件发送
- Android 交叉编译 Linux 可执行文件
- Android 工程中的 R.java 文件丢失后如何重新生成
- 【Android Developers Training】 25. 保存文件