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
da ist das gleiche, Speicher hinauf und stürzt ab...
Sie scheinen nicht zu veröffentlichen
_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
Du musst angemeldet sein, um einen Kommentar abzugeben.
die Antwort ist:
_env->DeleteLocalRef(jBuff);
InformationsquelleAutor Rick
Du nicht angerufen
DetachCurrentThread()
für jedenAttachCurrentThread()
, die angefordert wird, in Java Native Interface Specification. Das macht die lokalen Referenzen (jBuff
undstr
) nicht in der Lage zu sein, automatisch freigegeben. Auch dieconst char*
holte durchGetStringUTFChars()
freigegeben werden muß.Dem richtigen Weg ist, ändern
in
InformationsquelleAutor timrau