JNI NewByteArray Speicherverlust

Ich habe eine Java-Methode, Prozess-ein bitmap und gibt einen String zurück.
Wenn ich rufe diese Methode von JNI (VS 2010) funktioniert es, aber wenn ich diese Methode aufrufen, viele Male,
die Erinnerung an den Prozess gewachsen, der bis zum Absturz.
Die Anweisung, die sehr viel Arbeitsspeicher ist:

jbyteArray jBuff = _env->NewByteArray(b->Length);

Mein code:

static jobject staticArray=0;

System::String^ MyClass::ExecuteJavaMethod(System::Drawing::Bitmap^ bmp)
{
    JNIEnv *_env;
    System::String^ out;
    unsigned const char * buff;

    int res = jvm->AttachCurrentThread((void **)&_env, NULL);

    if (jvm->GetEnv((void**) &_env, JNI_VERSION_1_6) != JNI_OK)
    {
        return "GetEnv ERROR";
    }

    //save the bitmap in the stream
    MemoryStream^ ms = gcnew MemoryStream();
    bmp->Save(ms, ImageFormat::Bmp);

    //get the bitmap buffer
    array<unsigned char>^b = ms->GetBuffer() ;

    //unmanaged conversion
    buff = GetUnmanaged(b,b->Length);


    //fill the buffer
    jbyteArray jBuff = _env->NewByteArray(b->Length);       
    _env->SetByteArrayRegion(jBuff, 0, b->Length, (jbyte*) buff);

    //call the java method
    jstring str = (jstring) _env->CallStaticObjectMethod (  Main,
                                javaMethod,
                                jBuff);



    //_env->ReleaseByteArrayElements(jBuff,(jbyte*)buff), 0); //NOT WORKING

    //staticArray= _env->NewGlobalRef(jBuff);  NOT
    //_env->DeleteLocalRef(jBuff);             WORKING  


    //return the string result of the java method
    return gcnew String(env->GetStringUTFChars(str, 0));

}
Warum hast du Kommentar, Ihre Linie, die nicht _ReleaseByteArrayElements()?
da ist das gleiche, Speicher hinauf und stürzt ab...
Sie scheinen nicht zu veröffentlichen buff an jedem beliebigen Punkt. Ist GetUnmanaged Zuordnung einer temporären Puffer, der wird nie zurückgefordert?

InformationsquelleAutor Rick | 2011-12-20

Schreibe einen Kommentar