2011-07-15 42 views
1

我對C++和JNI不太瞭解,所以我對這段代碼的某些部分(這是Android框架的一部分,更確切地說來自CPP源代碼在Surface類):從Android內核中解開一些JNI C++代碼

static void Surface_unlockCanvasAndPost(
     JNIEnv* env, jobject clazz, jobject argCanvas) 
{ 
    jobject canvas = env->GetObjectField(clazz, so.canvas); 
    if (canvas != argCanvas) { 
     doThrow(env, "java/lang/IllegalArgumentException", NULL); 
     return; 
    } 

    const sp<Surface>& surface(getSurface(env, clazz)); 
    if (!Surface::isValid(surface)) 
     return; 

    // detach the canvas from the surface 
    SkCanvas* nativeCanvas = 
     (SkCanvas*) env->GetIntField(canvas, no.native_canvas); 
    int saveCount = env->GetIntField(clazz, so.saveCount); 
    nativeCanvas->restoreToCount(saveCount); 
    nativeCanvas->setBitmapDevice(SkBitmap()); 
    env->SetIntField(clazz, so.saveCount, 0); 

    // unlock surface 
    status_t err = surface->unlockAndPost(); 
    if (err < 0) { 
     doThrow(env, "java/lang/IllegalArgumentException", NULL); 
    } 
} 

什麼特別困擾我的是:

const sp<Surface>& surface(getSurface(env, clazz)); 

這只是我百思不得其解。沒有等號,這些模板讓它更難理解。

有人可以幫我解決這個特定的代碼行嗎?

回答

2

這是一個參考構造函數調用的語法 - 這是一個有點混淆把它寫這樣的,就像寫int i(23);代替int i = 23;,但它是真的等同於寫 const sp<Surface>& surface = getSurface(env, clazz);

+0

華麗。非常感謝!儘管如此,它確實打敗了我作爲一種語法。 –

+1

那麼,對於一個有值類型的語言來說是有意義的,編寫'MyObject i(「foo」);'而不是'MyObject i = MyObject(「foo」);''是方便的。 – themel

+0

你知道這種表示法是否有名字,因爲它在覈心cpp文件中無處不在。這對Java開發人員來說確實令人不安。另外,你知道這樣的語法在C中是否有效嗎? –