我的C++测试代码如下:#include "com_cn_SKiaView.h"
#include "SkCanvas.h"
#include "SkPaint.h"
#include "SkGraphics.h"
#include "SkColor.h"
#include "SkTypes.h"
#include "GraphicsJNI.h"
#include <utils/Log.h>JNIEXPORT jint JNICALL Java_com_cn_SKiaView_renderHello
(JNIEnv *env, jobject thizz, jobject canvas)
{  
SkCanvas* canv = GraphicsJNI::getNativeCanvas(env, canvas);  
if (!canv)  
{  
LOGD("canv is NULL!\n");
return 0;  
}  
SkPaint paint;  
LOGD("setColor WHITE!\n");
paint.setColor(SK_ColorWHITE); 
paint.setTextSize(20);
canv->drawText("Hello", 5, 100, 100, pen);
canv->drawLine( 0,0, 100,100,paint);
LOGD("Hello LIB!\n"); return 1;
}  我的Java下的调用代码如下:
public class SKiaView extends View  
{  
    private static final String TAG = "SKIAJNI";  
    static   
    {  
        System.loadLibrary("skiajni");  
    }  
      
    public native int renderHello(Canvas canvas);  
      
    public SKiaView(Context context)  
    {  
        super(context);  
    }  
      
    @Override  
    public void onDraw(Canvas canvas)  
    {  
        super.onDraw(canvas);  
          
        Log.d(TAG, "before renderHello");  
        renderHello(canvas);  
        Log.d(TAG, "after renderHello");              }  
}  为什么canv->drawLine()可以画出线,canv->drawText()却不能显示文字?

解决方案 »

  1.   

    canv->drawText("Hello", 5, 100, 100, pen);
    需要设置画笔Paint pen=new Paint();
    pen.setColor(Color.Red);
      

  2.   


    哦,对不起,真抱歉.我复制代码时,忘了把pen修改成paint了.
    canv->drawText("Hello", 5, 100, 100, paint);总之,还是不能显示文字.但用Android的Canvas类的drawText确可以显示.真奇怪,不知是不是别的原因.
      

  3.   

    奇怪你的drawText怎么带了5个参数?JAVA层调只要4个啊!你的字体都没创建或者指定大小吧!!!
      

  4.   

    你好,JAVA层是只有4个参数,但是JAVA最后调的是C++的SKIA图形库函数,是5个参数.
    我那个5个参数的是通过JNI方式在C++层调用的.
      

  5.   

    你好,你可能要去看看NDK环境,它是用来快速通过你的C代码生成动态库的.只不过现在的NDK还才起步,没有很好的可视化的IDE,需要用到不少LINUX下的编译知识.
      

  6.   

    确认可以调到下面的函数..并能打印出LOG日志.模拟器和真机都只画出了线,却没有绘出文本,在网上看到别人可以绘出文本,不知道会是什么原因.难道我下载的SKIA源代码的接口和实际用的模拟器的SKIA库的接口有所不同?
      

  7.   

    canv->drawText("Hello", 5, 100, 100, pen);java中此方法是4个或者6个参数,楼主C++多出的那个参数是什么?有什么用?
    canv->drawLine( 0,0, 100,100,paint);java中是5个参数,这里C++调用参数怎么又没变还是5个?麻烦楼主
      

  8.   

    canv->drawLine( 0,0, 100,100,paint);头4个参数是起点和终点共x1,y1,x2,y2坐标.最后一个是Paint.参数.在SkCanvas类中没有变,因为是画线.
      

  9.   

    这个问题我自己解决了.
    分享一下原因,希望大家以后也小心.原因是因为我在编译的时候,
    Android.mk文件的Include路径中包含skia的源代码来自于不同的地方.
    一个是来源于用git下载的android2.2 (froyo)源代码中的中skia.
    另一个是来源于svn https://skia.googlecode.com/svn/trunk将我的Android.mk文件中的内容(头文件来源于svn https://skia.googlecode.com/svn/trunk).
    LOCAL_CXXFLAGS :=
    LOCAL_C_INCLUDES := \
    E:/NDKr5/sources/SKIA/include/core \
    E:/NDKr5/sources/SKIA/include/config \

    E:/NDKr5/sources/android/frameworks/base/include \
    E:/NDKr5/sources/android/system/core/include \
    E:/NDKr5/sources/android/frameworks/base/core/jni/android/graphics \
    E:/NDKr5/sources/android/dalvik/libnativehelper/include改成:(头文件目录在android2.2 (froyo)源代码的skia中.)
    E:/NDKr5/sources/android/external/skia/include/core \
    E:/NDKr5/sources/android/external/skia/include/config \

    E:/NDKr5/sources/android/frameworks/base/include \
    E:/NDKr5/sources/android/system/core/include \
    E:/NDKr5/sources/android/frameworks/base/core/jni/android/graphics \
    E:/NDKr5/sources/android/dalvik/libnativehelper/include就可以了.
    已经在模拟器和真机上验证了.总结:造成这个问题的原因应该是在编译时,mk文件中编译选项用了与当前模拟器或真机上SKIA动态库版本不一致的源代码进行编译的,导致编译出来的.so动态库调用的接口和模拟器或真机环境上的SKIA动态库接口不一致造成的.
      

  10.   

    你好,因为Java调底下一层的SKIA库代码还需要带一个字符串长度参数.canv->drawText("Hello", 5, 100, 100, paint);这里的"Hello"的长度是5,JAVA中只需要4个参数,大概是因为这个Canvas类封装了,里面会计算字符串的长度.如果你跟进一下这个类的drawText函数.你会发现最后调用的Native本地函数是5个参数.另一个字符串长度会在类封装中计算出来.
      

  11.   


    svn https://skia.googlecode.com/svn/trunk下有东西可参考?!
      

  12.   

    请问楼主,如何用drawText显示英文啊?
      

  13.   

    没有找到字体,写字之前设置android中的字体,font