Android NDK中SKIA无法画出文字

时间:2021-09-21 11:52:08
我在Windows下,搭建了cygwin
使用的NDK是android-ndk-r6,
使用的Android SDK版本是2.3.1
Android源码使用的是git下载的:git clone http://android.git.kernel.org/...其中包括了external/skia
然后在模拟器中把libskia.so, libskiagl.so,libjnigraphics.so和libandroid_runtime.so提取了出来,
放在了NDK下的platforms\android-9\arch-arm\usr\lib中
我的mk文件是这样的:
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

MY_ANDROID_SOURCE=/cygdrive/d/Android_Source

LOCAL_MODULE := libSkiaDemo
LOCAL_CPP_EXTENSION := .cpp
LOCAL_CXXFLAGS :=

LOCAL_C_INCLUDES := $(MY_ANDROID_SOURCE)/frameworks/base/core/jni/android/graphics \
$(MY_ANDROID_SOURCE)/external/skia/include/core \
$(MY_ANDROID_SOURCE)/external/skia/include/images \
$(MY_ANDROID_SOURCE)/external/skia/include/config \
$(MY_ANDROID_SOURCE)/frameworks/base/include \
$(MY_ANDROID_SOURCE)/system/core/include 

LOCAL_SRC_FILES := SkiaDemoJni.cpp

LOCAL_LDLIBS := -llog -lsgl -lskia -lskiagl -ljnigraphics -landroid_runtime \
-L$(MY_ANDROID_SOURCE)/out/target/product/generic/system/lib/

include $(BUILD_SHARED_LIBRARY)


NDK中的画字符的代码是这样的:
void Java_com_whtr_example_skiademo_SkiaView_renderText(JNIEnv *env, jobject thizz, jobject canvas)
{
SkCanvas* canv = GraphicsJNI::getNativeCanvas(env, canvas);
if (!canv)
{
__android_log_print(ANDROID_LOG_DEBUG, "bug", "canvas is null "); 
//LOGE("!canv");
return;
}
__android_log_print(ANDROID_LOG_DEBUG, "bug", "canvas is NOT null "); 

SkPaint paint;
char text[256] = {0};
paint.setColor(SK_ColorBLACK);
strcpy(text, "Hello");
canv->drawText(text, strlen(text), 20, 20, paint);

strcpy(text, "what when");
paint.setAntiAlias(true);
canv->drawText(text, strlen(text), 20, 60, paint);

strcpy(text, "oh, god");
paint.setSubpixelText(true);
canv->drawText(text, strlen(text), 20, 100, paint);

}


然后在cygwin中用$NDK/ndk-build编译并且运行,结果是画不出来。然后我又试了画线和画矩形,是可以画出来的。
大家知道是什么原因吗?
我在下载源码的时候并没有选择那个版本,只是写了路径,如:
git clone http://android.git.kernel.org/framework/base,跟版本有关系吗?

12 个解决方案

#1


该回复于2012-02-29 09:23:59被版主删除

#2


哎,再人工置顶一次,希望有大大能帮忙看看

#3


是不是没有设置 字体 或者 字号 导致的?

#4


引用 3 楼 lazy_2010 的回复:
是不是没有设置 字体 或者 字号 导致的?

多谢回复!
我在代码中加入了以下这两句:
paint.setTypeface(SkTypeface::CreateFromName("sans-serif", SkTypeface::kNormal));
//Set Text Size
paint.setTextSize(SkIntToScalar(40));

并且引用了#include "SkTypeface.h"

还是没有出来。能再帮我看看吗?

#5


哎,人工置顶,希望有人能帮忙看看

#6


paint.setColor(SK_ColorBLACK);

会不会是你的背景是黑色的,字也是黑色的。。

#7


引用 6 楼 sniffer12345 的回复:
paint.setColor(SK_ColorBLACK);

会不会是你的背景是黑色的,字也是黑色的。。

我的背景是白色的。

#8


该回复于2012-03-03 16:07:04被版主删除

#9


终于解决了,谢谢你们两个的回复。
原因就是Android源码的版本不正确。

#10


请问楼主具体是什么原因呢?怎么对应起来的呢?

#11


引用 10 楼 ailyanlu 的回复:
请问楼主具体是什么原因呢?怎么对应起来的呢?

具体原因就是因为so包如果和源码的版本不匹配,那么有些函数功能就不正确。
至于如何对应,那么就是仔细检查你的代码和配置,如果确定这些都没有问题,但是功能却不正确,或者根本不起作用,那么估计就跟引用的源码的版本有问题。还有一个要注意的就是字符串是以左下角为起点的,而不是一般意义上的左上角。

#12


能问一下我用下面的代码为什么写不出字在图片上 老显示skfonthost的一个函数没有完成
       SkTypeface *font =  SkTypeface::CreateFromFile("C:\\Windows\\Fonts\\simkai.tt"); 
if ( font ) 

paint.setARGB(255, 255, 0, 0); 
    paint.setTypeface( font ); 
paint.setTextSize(24); 
canvas.drawText("卡", 8,  0, 70, paint); 

#1


该回复于2012-02-29 09:23:59被版主删除

#2


哎,再人工置顶一次,希望有大大能帮忙看看

#3


是不是没有设置 字体 或者 字号 导致的?

#4


引用 3 楼 lazy_2010 的回复:
是不是没有设置 字体 或者 字号 导致的?

多谢回复!
我在代码中加入了以下这两句:
paint.setTypeface(SkTypeface::CreateFromName("sans-serif", SkTypeface::kNormal));
//Set Text Size
paint.setTextSize(SkIntToScalar(40));

并且引用了#include "SkTypeface.h"

还是没有出来。能再帮我看看吗?

#5


哎,人工置顶,希望有人能帮忙看看

#6


paint.setColor(SK_ColorBLACK);

会不会是你的背景是黑色的,字也是黑色的。。

#7


引用 6 楼 sniffer12345 的回复:
paint.setColor(SK_ColorBLACK);

会不会是你的背景是黑色的,字也是黑色的。。

我的背景是白色的。

#8


该回复于2012-03-03 16:07:04被版主删除

#9


终于解决了,谢谢你们两个的回复。
原因就是Android源码的版本不正确。

#10


请问楼主具体是什么原因呢?怎么对应起来的呢?

#11


引用 10 楼 ailyanlu 的回复:
请问楼主具体是什么原因呢?怎么对应起来的呢?

具体原因就是因为so包如果和源码的版本不匹配,那么有些函数功能就不正确。
至于如何对应,那么就是仔细检查你的代码和配置,如果确定这些都没有问题,但是功能却不正确,或者根本不起作用,那么估计就跟引用的源码的版本有问题。还有一个要注意的就是字符串是以左下角为起点的,而不是一般意义上的左上角。

#12


能问一下我用下面的代码为什么写不出字在图片上 老显示skfonthost的一个函数没有完成
       SkTypeface *font =  SkTypeface::CreateFromFile("C:\\Windows\\Fonts\\simkai.tt"); 
if ( font ) 

paint.setARGB(255, 255, 0, 0); 
    paint.setTypeface( font ); 
paint.setTextSize(24); 
canvas.drawText("卡", 8,  0, 70, paint);