0

MonitorEnter JNI関数のobjがわかりません。同期したいのは、ネイティブ関数または共有変数でパラメーターとして渡された obj ですか? 2 つのスレッドで共有される buffer という変数があります。これは私のコードです。

JNIEXPORT void JNICALL Java_company_com_HelloActivity_setBuffer(JNIEnv *env, jobject obj, jstring jstr)
{
    char buf[256];

    int len = (*env)->GetStringLength(env, jstr);       
    (*env)->GetStringUTFRegion(env, jstr, 0, len, buf);
    (*env)->MonitorEnter(env, obj); // I don't think this is correct.
    strcat(buffer, buf); // buffer is declared as global char buffer[256];
    (*env)->MonitorExit(env, obj);
}

編集:これはどうですか?syncobj はアクティビティで静的オブジェクトとして定義され、別のスレッドと共有されます。

JNIEXPORT void JNICALL Java_company_com_HelloActivity_setBuffer(JNIEnv *env, jobject obj, jstring jstr, jobject syncobj)
{
    char buf[256];

    int len = (*env)->GetStringLength(env, jstr);       
    (*env)->GetStringUTFRegion(env, jstr, 0, len, buf);
    (*env)->MonitorEnter(env, syncobj);
    strcat(buffer, buf);
    (*env)->MonitorExit(env, syncobj);
}
4

2 に答える 2

2

これは、次の Java コードとまったく同じです。

synchronized (syncobj) // = MonitorEnter(env, syncobj)
{
  // ...
} // = MonitorExit(env, syncobj)
于 2012-07-30T09:57:53.127 に答える
0

最初のスニペットは に相当しsynchronized(this)、2 番目のスニペットはsynchronized(syncobj). ただし、両方のスニペットは、アクセスしている他のスレッドが または のいずれかbufferを見ることができる場合にのみ意味があります。残念ながら、もう一方のスレッドはネイティブ スレッドです。では、なぜネイティブ コードで を作成するのでしょうか。私が正しければ、MonitorEnter/Exit は不必要に難解です。使用できますが、他のネイティブ スレッドはorへのグローバル参照を保持する必要があります。ネイティブ ロックは、よりクリーンなソリューションのように思えます。JVM リソースではなく、ネイティブ リソースをロックしています。thissyncobjbufferthissyncobj

于 2012-07-30T12:18:13.877 に答える