JNI:封装Android中Canvas类下的drawBitmap()函数问题请教!

Begodya 2010-11-02 05:19:00
请教:
画位图在Android下实现方法为:

// 从资源文件中生成位图
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.icon);
// 绘图
canvas.drawBitmap(bitmap, 10, 10, paint);


现要用JNI封装Android中Canvas类下的drawBitmap(Bitmap bitmap, float left, float top, Paint paint) 函数;

//位图
jobject CVMAndroidDC::GetResources()
{
static jmethodID jmidGetResources=NULL;
if(jmidGetResources==NULL)
{
jclass jclsView=m_pJNIEnv->FindClass("android/view/View");
jmidGetResources=m_pJNIEnv->GetMethodID(jclsView, "getResources", "()Landroid/content/res/Resources;");

m_pJNIEnv->DeleteLocalRef(jclsView); //回收
}
return m_pJNIEnv->CallObjectMethod(m_jobjView, jmidGetResources); //return -> Resources
}

//问题主要出在这一DecodeResource()函数的封装,---->LOG提示,GetMethodID:method not found:decodeResource(Landroid/content/res/Resources;I)Landroid/graphics/Bitmap;)

jobject CVMAndroidDC::DecodeResource(int id)
{
GetResources();

static jmethodID jmidDecodeResource=NULL;
if(jmidDecodeResource==NULL)
{
jclass jclsBitmapFactory=m_pJNIEnv->FindClass("android/graphics/BitmapFactory");
jmidDecodeResource=m_pJNIEnv->GetMethodID(jclsBitmapFactory, "decodeResource", "(Landroid/content/res/Resources;I)Landroid/graphics/Bitmap;");

m_pJNIEnv->DeleteLocalRef(jclsBitmapFactory); //回收
}
/* return m_pJNIEnv->CallStaticObjectMethod(m_jobjBitmapFactory, jmidDecodeResource, m_jobjView, id);
当调用CallStaticObjectMethod时Eclipse会提示error: invalid conversion from '_jobject*' to '_jclass*'
*/
return m_pJNIEnv->CallObjectMethod(m_jobjBitmapFactory, jmidDecodeResource, m_jobjView, id); //return ->Static Bitmap
}


VOID CVMAndroidDC::DrawBitmap(int left, int top)
{
static jmethodID jmidDrawBitmap=NULL;
if(jmidDrawBitmap==NULL)
{
jclass jclsCanvas=m_pJNIEnv->FindClass("android/graphics/Canvas");
jmidDrawBitmap=m_pJNIEnv->GetMethodID(jclsCanvas, "drawBitmap", "(Landroid/graphics/Bitmap;FFLandroid/graphics/Paint;)V");
m_pJNIEnv->DeleteLocalRef(jclsCanvas); //回收
}
m_pJNIEnv->CallVoidMethod(m_jobjCanvas, jmidDrawBitmap, m_jobjBitmapFactory, (jfloat)left, (jfloat)top, m_jobjPaint);
}
...全文
3607 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
xqhrs232 2011-05-13
  • 打赏
  • 举报
回复
不知道楼主怎么解决的!!!
Begodya 2010-11-09
  • 打赏
  • 举报
回复
问题已解决。
Begodya 2010-11-04
  • 打赏
  • 举报
回复

将Resources res=this.getResources();===>Returns the resources associated with this view.
封装如下:

jobject CVMAndroidDC::GetResources()
{
static jmethodID jmidGetResources=NULL;
if(jmidGetResources==NULL)
{
jclass jclsView=m_pJNIEnv->FindClass("android/view/View");
jmidGetResources=m_pJNIEnv->GetMethodID(jclsView, "getResources", "()Landroid/content/res/Resources;");

m_pJNIEnv->DeleteLocalRef(jclsView); //回收
}
res = m_pJNIEnv->CallObjectMethod(m_jobjView, jmidGetResources);

if(res==NULL) //问题=====> getResources()返回资源为空,因为只是单纯的调用getResources()函数,并没用指定获取的是具体哪个对象的资源;
TRACE("res is NULL!!!\n");

return res;
}
javacn_org 2010-11-03
  • 打赏
  • 举报
回复
ddddd
Begodya 2010-11-02
  • 打赏
  • 举报
回复

jmidDecodeResource=m_pJNIEnv->GetStaticMethodID(jclsBitmapFactory, "decodeResource", "(Landroid/content/res$Resources;I)Landroid/graphics/Bitmap;");

return m_pJNIEnv->CallStaticObjectMethod(m_jobjBitmapFactory, jmidDecodeResource, m_jobjView, id);

80,357

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧