请教:
画位图在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);
}

解决方案 »

  1.   


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

  2.   


    将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;
    }