请教:
画位图在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);
}
画位图在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);
}
jmidDecodeResource=m_pJNIEnv->GetStaticMethodID(jclsBitmapFactory, "decodeResource", "(Landroid/content/res$Resources;I)Landroid/graphics/Bitmap;");return m_pJNIEnv->CallStaticObjectMethod(m_jobjBitmapFactory, jmidDecodeResource, m_jobjView, id);
将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;
}