我的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()却不能显示文字?
#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()却不能显示文字?
需要设置画笔Paint pen=new Paint();
pen.setColor(Color.Red);
哦,对不起,真抱歉.我复制代码时,忘了把pen修改成paint了.
canv->drawText("Hello", 5, 100, 100, paint);总之,还是不能显示文字.但用Android的Canvas类的drawText确可以显示.真奇怪,不知是不是别的原因.
我那个5个参数的是通过JNI方式在C++层调用的.
canv->drawLine( 0,0, 100,100,paint);java中是5个参数,这里C++调用参数怎么又没变还是5个?麻烦楼主
分享一下原因,希望大家以后也小心.原因是因为我在编译的时候,
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动态库接口不一致造成的.
svn https://skia.googlecode.com/svn/trunk下有东西可参考?!