[ 1053870 ] jacob-msg 2019 - SafeArray + jni 1.4. Fixed a few problems with safe array manipulation that caused memory leaks. Also applied patch required to build against JMI newer than v1.2
This commit is contained in:
@@ -80,7 +80,12 @@ EventProxy::~EventProxy()
|
||||
pCP->Unadvise(dwEventCookie);
|
||||
JNIEnv *env;
|
||||
// attach to the current running thread
|
||||
jvm->AttachCurrentThread((void **)&env, jvm);
|
||||
#ifdef JNI_VERSION_1_2
|
||||
jvm->AttachCurrentThread((void **)&env, jvm);
|
||||
#else
|
||||
jvm->AttachCurrentThread((void**)&env, NULL);
|
||||
#endif
|
||||
|
||||
|
||||
env->DeleteGlobalRef(javaSinkObj);
|
||||
if (env->ExceptionOccurred()) { env->ExceptionDescribe(); }
|
||||
@@ -140,7 +145,11 @@ STDMETHODIMP EventProxy::Invoke(DISPID dispID, REFIID riid,
|
||||
if (DISPATCH_METHOD & wFlags)
|
||||
{
|
||||
// attach to the current running thread
|
||||
jvm->AttachCurrentThread((void**)&env, jvm);
|
||||
#ifdef JNI_VERSION_1_2
|
||||
jvm->AttachCurrentThread((void **)&env, jvm);
|
||||
#else
|
||||
jvm->AttachCurrentThread((void**)&env, NULL);
|
||||
#endif
|
||||
|
||||
|
||||
// get variant class
|
||||
|
||||
@@ -98,13 +98,18 @@ SAFEARRAY *copySA(SAFEARRAY *psa)
|
||||
SafeArrayGetVartype(psa, &vt);
|
||||
VARIANT v1, v2;
|
||||
|
||||
VariantClear(&v1);
|
||||
VariantClear(&v2);
|
||||
VariantInit(&v1);
|
||||
VariantInit(&v2);
|
||||
V_VT(&v1) = VT_ARRAY | vt;
|
||||
V_ARRAY(&v1) = psa;
|
||||
VariantCopy(&v2, &v1);
|
||||
SAFEARRAY *sa = V_ARRAY(&v2);
|
||||
VariantInit(&v2); // make sure it's not owned by this variant
|
||||
|
||||
VariantClear(&v2);
|
||||
VariantInit(&v1);
|
||||
VariantClear(&v1);
|
||||
|
||||
return sa;
|
||||
}
|
||||
|
||||
|
||||
@@ -1028,7 +1028,7 @@ JNIEXPORT void JNICALL Java_com_jacob_com_Variant_putSafeArray
|
||||
VARTYPE vt;
|
||||
SafeArrayGetVartype(psa, &vt);
|
||||
V_VT(v) = VT_ARRAY | vt;
|
||||
V_ARRAY(v) = psa;
|
||||
V_ARRAY(v) = copySA(psa);
|
||||
return;
|
||||
}
|
||||
ThrowComFail(env, "Can't get variant pointer", -1);
|
||||
|
||||
@@ -5,4 +5,6 @@ extern "C" {
|
||||
IDispatch *extractDispatch(JNIEnv *env, jobject arg);
|
||||
SAFEARRAY *extractSA(JNIEnv *env, jobject arg);
|
||||
void setSA(JNIEnv *env, jobject arg, SAFEARRAY *sa, int copy);
|
||||
|
||||
SAFEARRAY *copySA(SAFEARRAY *psa)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user