Bug 285591 - Do not cache JNIEnv structure. Instead, query from JavaVM. Not part of default build. a=mkaply

Original committer: pedemont%us.ibm.com
Original revision: 1.32
Original date: 2005/05/03 20:15:35


git-svn-id: svn://10.0.0.236/trunk@212604 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
pedemont%us.ibm.com
2006-09-27 15:17:28 +00:00
parent 18874e2595
commit 7bd43e3db2

View File

@@ -45,22 +45,21 @@
#include "nsCRT.h"
nsJavaXPTCStub::nsJavaXPTCStub(JNIEnv* aJavaEnv, jobject aJavaObject,
nsIInterfaceInfo *aIInfo)
: mJavaEnv(aJavaEnv)
, mJavaStrongRef(nsnull)
nsJavaXPTCStub::nsJavaXPTCStub(jobject aJavaObject, nsIInterfaceInfo *aIInfo)
: mJavaStrongRef(nsnull)
, mIInfo(aIInfo)
, mMaster(nsnull)
, mWeakRefCnt(0)
{
mJavaWeakRef = aJavaEnv->NewWeakGlobalRef(aJavaObject);
JNIEnv* env = GetJNIEnv();
mJavaWeakRef = env->NewWeakGlobalRef(aJavaObject);
#ifdef DEBUG_JAVAXPCOM
nsIID* iid;
mIInfo->GetInterfaceIID(&iid);
char* iid_str = iid->ToString();
LOG(("+ nsJavaXPTCStub (Java=%08x | XPCOM=%08x | IID=%s)\n",
(PRUint32) aJavaEnv->CallIntMethod(aJavaObject, hashCodeMID),
(PRUint32) env->CallIntMethod(aJavaObject, hashCodeMID),
(PRUint32) this, iid_str));
PR_Free(iid_str);
nsMemory::Free(iid);
@@ -77,7 +76,7 @@ nsJavaXPTCStub::AddRefInternal()
// If this is the first AddRef call, we create a strong global ref to the
// Java object to keep it from being garbage collected.
if (mRefCnt == 0) {
mJavaStrongRef = mJavaEnv->NewGlobalRef(mJavaWeakRef);
mJavaStrongRef = GetJNIEnv()->NewGlobalRef(mJavaWeakRef);
NS_ASSERTION(mJavaStrongRef != nsnull, "Failed to acquire strong ref");
}
@@ -116,16 +115,17 @@ nsJavaXPTCStub::ReleaseInternal()
NS_LOG_RELEASE(this, mRefCnt, "nsJavaXPTCStub");
if (mRefCnt == 0) {
// If we have a weak ref, we don't delete this object.
JNIEnv* env = GetJNIEnv();
if (mWeakRefCnt == 0) {
mRefCnt = 1; /* stabilize */
Destroy();
// delete strong ref; allows Java object to be garbage collected
mJavaEnv->DeleteGlobalRef(mJavaStrongRef);
env->DeleteGlobalRef(mJavaStrongRef);
delete this;
} else {
// delete strong ref; allows Java object to be garbage collected
mJavaEnv->DeleteGlobalRef(mJavaStrongRef);
env->DeleteGlobalRef(mJavaStrongRef);
}
return 0;
}
@@ -153,13 +153,15 @@ nsJavaXPTCStub::Release()
void
nsJavaXPTCStub::Destroy()
{
JNIEnv* env = GetJNIEnv();
#ifdef DEBUG_JAVAXPCOM
nsIID* iid;
mIInfo->GetInterfaceIID(&iid);
char* iid_str = iid->ToString();
jobject javaObject = mJavaEnv->NewLocalRef(mJavaWeakRef);
jobject javaObject = env->NewLocalRef(mJavaWeakRef);
LOG(("- nsJavaXPTCStub (Java=%08x | XPCOM=%08x | IID=%s)\n",
(PRUint32) mJavaEnv->CallIntMethod(javaObject, hashCodeMID),
(PRUint32) env->CallIntMethod(javaObject, hashCodeMID),
(PRUint32) this, iid_str));
PR_Free(iid_str);
nsMemory::Free(iid);
@@ -172,11 +174,11 @@ nsJavaXPTCStub::Destroy()
}
if (gJavaXPCOMInitialized) {
gJavaToXPTCStubMap->Remove(mJavaEnv, mJavaStrongRef);
gJavaToXPTCStubMap->Remove(env, mJavaStrongRef);
}
}
mJavaEnv->DeleteWeakGlobalRef(mJavaWeakRef);
env->DeleteWeakGlobalRef(mJavaWeakRef);
}
void
@@ -201,7 +203,7 @@ nsJavaXPTCStub::ReleaseWeakRef()
void
nsJavaXPTCStub::DeleteStrongRef()
{
mJavaEnv->DeleteGlobalRef(mJavaStrongRef);
GetJNIEnv()->DeleteGlobalRef(mJavaStrongRef);
mJavaStrongRef = nsnull;
}
@@ -246,20 +248,22 @@ nsJavaXPTCStub::QueryInterface(const nsID &aIID, void **aInstancePtr)
return NS_OK;
}
JNIEnv* env = GetJNIEnv();
// Query Java object
LOG(("\tCalling Java object queryInterface\n"));
jobject javaObject = mJavaEnv->NewLocalRef(mJavaWeakRef);
jobject javaObject = env->NewLocalRef(mJavaWeakRef);
jmethodID qiMID = 0;
jclass clazz = mJavaEnv->GetObjectClass(javaObject);
jclass clazz = env->GetObjectClass(javaObject);
if (clazz) {
char* sig = "(Ljava/lang/String;)Lorg/mozilla/xpcom/nsISupports;";
qiMID = mJavaEnv->GetMethodID(clazz, "queryInterface", sig);
qiMID = env->GetMethodID(clazz, "queryInterface", sig);
NS_ASSERTION(qiMID, "Failed to get queryInterface method ID");
}
if (qiMID == 0) {
mJavaEnv->ExceptionClear();
env->ExceptionClear();
return NS_NOINTERFACE;
}
@@ -267,18 +271,18 @@ nsJavaXPTCStub::QueryInterface(const nsID &aIID, void **aInstancePtr)
jstring iid_jstr = nsnull;
char* iid_str = aIID.ToString();
if (iid_str) {
iid_jstr = mJavaEnv->NewStringUTF(iid_str);
iid_jstr = env->NewStringUTF(iid_str);
}
if (!iid_str || !iid_jstr) {
mJavaEnv->ExceptionClear();
env->ExceptionClear();
return NS_ERROR_OUT_OF_MEMORY;
}
PR_Free(iid_str);
// call queryInterface method
jobject obj = mJavaEnv->CallObjectMethod(javaObject, qiMID, iid_jstr);
if (mJavaEnv->ExceptionCheck()) {
mJavaEnv->ExceptionClear();
jobject obj = env->CallObjectMethod(javaObject, qiMID, iid_jstr);
if (env->ExceptionCheck()) {
env->ExceptionClear();
return NS_ERROR_FAILURE;
}
if (!obj)
@@ -291,7 +295,7 @@ nsJavaXPTCStub::QueryInterface(const nsID &aIID, void **aInstancePtr)
if (NS_FAILED(rv))
return rv;
stub = new nsJavaXPTCStub(mJavaEnv, obj, iinfo);
stub = new nsJavaXPTCStub(obj, iinfo);
if (!stub)
return NS_ERROR_OUT_OF_MEMORY;
@@ -379,7 +383,9 @@ nsJavaXPTCStub::CallMethod(PRUint16 aMethodIndex,
#endif
nsresult rv = NS_OK;
jobject javaObject = mJavaEnv->NewLocalRef(mJavaWeakRef);
JNIEnv* env = GetJNIEnv();
jobject javaObject = env->NewLocalRef(mJavaWeakRef);
nsCAutoString methodSig("(");
@@ -436,9 +442,9 @@ nsJavaXPTCStub::CallMethod(PRUint16 aMethodIndex,
methodName.SetCharAt(tolower(methodName[0]), 0);
}
jclass clazz = mJavaEnv->GetObjectClass(javaObject);
jclass clazz = env->GetObjectClass(javaObject);
if (clazz)
mid = mJavaEnv->GetMethodID(clazz, methodName.get(), methodSig.get());
mid = env->GetMethodID(clazz, methodName.get(), methodSig.get());
NS_ASSERTION(mid, "Failed to get requested method for Java object");
if (!mid)
rv = NS_ERROR_FAILURE;
@@ -448,47 +454,40 @@ nsJavaXPTCStub::CallMethod(PRUint16 aMethodIndex,
jvalue retval;
if (NS_SUCCEEDED(rv)) {
if (!retvalInfo) {
mJavaEnv->CallVoidMethodA(javaObject, mid, java_params);
env->CallVoidMethodA(javaObject, mid, java_params);
} else {
switch (retvalInfo->GetType().TagPart())
{
case nsXPTType::T_I8:
case nsXPTType::T_U8:
retval.b = mJavaEnv->CallByteMethodA(javaObject, mid,
java_params);
retval.b = env->CallByteMethodA(javaObject, mid, java_params);
break;
case nsXPTType::T_I16:
case nsXPTType::T_U16:
retval.s = mJavaEnv->CallShortMethodA(javaObject, mid,
java_params);
retval.s = env->CallShortMethodA(javaObject, mid, java_params);
break;
case nsXPTType::T_I32:
case nsXPTType::T_U32:
retval.i = mJavaEnv->CallIntMethodA(javaObject, mid,
java_params);
retval.i = env->CallIntMethodA(javaObject, mid, java_params);
break;
case nsXPTType::T_FLOAT:
retval.f = mJavaEnv->CallFloatMethodA(javaObject, mid,
java_params);
retval.f = env->CallFloatMethodA(javaObject, mid, java_params);
break;
case nsXPTType::T_DOUBLE:
retval.d = mJavaEnv->CallDoubleMethodA(javaObject, mid,
java_params);
retval.d = env->CallDoubleMethodA(javaObject, mid, java_params);
break;
case nsXPTType::T_BOOL:
retval.z = mJavaEnv->CallBooleanMethodA(javaObject, mid,
java_params);
retval.z = env->CallBooleanMethodA(javaObject, mid, java_params);
break;
case nsXPTType::T_CHAR:
case nsXPTType::T_WCHAR:
retval.c = mJavaEnv->CallCharMethodA(javaObject, mid,
java_params);
retval.c = env->CallCharMethodA(javaObject, mid, java_params);
break;
case nsXPTType::T_CHAR_STR:
@@ -500,13 +499,11 @@ nsJavaXPTCStub::CallMethod(PRUint16 aMethodIndex,
case nsXPTType::T_CSTRING:
case nsXPTType::T_INTERFACE:
case nsXPTType::T_INTERFACE_IS:
retval.l = mJavaEnv->CallObjectMethodA(javaObject, mid,
java_params);
retval.l = env->CallObjectMethodA(javaObject, mid, java_params);
break;
case nsXPTType::T_VOID:
retval.i = mJavaEnv->CallIntMethodA(javaObject, mid,
java_params);
retval.i = env->CallIntMethodA(javaObject, mid, java_params);
break;
default:
@@ -516,20 +513,20 @@ nsJavaXPTCStub::CallMethod(PRUint16 aMethodIndex,
}
// Check for exception from called Java function
jthrowable exp = mJavaEnv->ExceptionOccurred();
jthrowable exp = env->ExceptionOccurred();
if (exp) {
#ifdef DEBUG
mJavaEnv->ExceptionDescribe();
env->ExceptionDescribe();
#endif
// If the exception is an instance of XPCOMException, then get the
// nsresult from the exception instance. Else, default to
// NS_ERROR_FAILURE.
if (mJavaEnv->IsInstanceOf(exp, xpcomExceptionClass)) {
if (env->IsInstanceOf(exp, xpcomExceptionClass)) {
jfieldID fid;
fid = mJavaEnv->GetFieldID(xpcomExceptionClass, "errorcode", "J");
fid = env->GetFieldID(xpcomExceptionClass, "errorcode", "J");
if (fid) {
rv = mJavaEnv->GetLongField(exp, fid);
rv = env->GetLongField(exp, fid);
} else {
rv = NS_ERROR_FAILURE;
}
@@ -567,7 +564,7 @@ nsJavaXPTCStub::CallMethod(PRUint16 aMethodIndex,
delete [] java_params;
LOG(("<--- (Java) %s::%s()\n", ifaceName, aMethodInfo->GetName()));
mJavaEnv->ExceptionClear();
env->ExceptionClear();
return rv;
}
@@ -583,6 +580,7 @@ nsJavaXPTCStub::SetupJavaParams(const nsXPTParamInfo &aParamInfo,
nsACString &aMethodSig)
{
nsresult rv = NS_OK;
JNIEnv* env = GetJNIEnv();
const nsXPTType &type = aParamInfo.GetType();
PRUint8 tag = type.TagPart();
@@ -595,13 +593,13 @@ nsJavaXPTCStub::SetupJavaParams(const nsXPTParamInfo &aParamInfo,
aMethodSig.Append('B');
} else { // 'inout' & 'out'
if (aVariant.val.p) {
jbyteArray array = mJavaEnv->NewByteArray(1);
jbyteArray array = env->NewByteArray(1);
if (!array) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
}
mJavaEnv->SetByteArrayRegion(array, 0, 1, (jbyte*) aVariant.val.p);
env->SetByteArrayRegion(array, 0, 1, (jbyte*) aVariant.val.p);
aJValue.l = array;
} else {
aJValue.l = nsnull;
@@ -620,13 +618,13 @@ nsJavaXPTCStub::SetupJavaParams(const nsXPTParamInfo &aParamInfo,
aMethodSig.Append('S');
} else { // 'inout' & 'out'
if (aVariant.val.p) {
jshortArray array = mJavaEnv->NewShortArray(1);
jshortArray array = env->NewShortArray(1);
if (!array) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
}
mJavaEnv->SetShortArrayRegion(array, 0, 1, (jshort*) aVariant.val.p);
env->SetShortArrayRegion(array, 0, 1, (jshort*) aVariant.val.p);
aJValue.l = array;
} else {
aJValue.l = nsnull;
@@ -645,13 +643,13 @@ nsJavaXPTCStub::SetupJavaParams(const nsXPTParamInfo &aParamInfo,
aMethodSig.Append('I');
} else { // 'inout' & 'out'
if (aVariant.val.p) {
jintArray array = mJavaEnv->NewIntArray(1);
jintArray array = env->NewIntArray(1);
if (!array) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
}
mJavaEnv->SetIntArrayRegion(array, 0, 1, (jint*) aVariant.val.p);
env->SetIntArrayRegion(array, 0, 1, (jint*) aVariant.val.p);
aJValue.l = array;
} else {
aJValue.l = nsnull;
@@ -670,13 +668,13 @@ nsJavaXPTCStub::SetupJavaParams(const nsXPTParamInfo &aParamInfo,
aMethodSig.Append('J');
} else { // 'inout' & 'out'
if (aVariant.val.p) {
jlongArray array = mJavaEnv->NewLongArray(1);
jlongArray array = env->NewLongArray(1);
if (!array) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
}
mJavaEnv->SetLongArrayRegion(array, 0, 1, (jlong*) aVariant.val.p);
env->SetLongArrayRegion(array, 0, 1, (jlong*) aVariant.val.p);
aJValue.l = array;
} else {
aJValue.l = nsnull;
@@ -693,13 +691,13 @@ nsJavaXPTCStub::SetupJavaParams(const nsXPTParamInfo &aParamInfo,
aMethodSig.Append('F');
} else { // 'inout' & 'out'
if (aVariant.val.p) {
jfloatArray array = mJavaEnv->NewFloatArray(1);
jfloatArray array = env->NewFloatArray(1);
if (!array) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
}
mJavaEnv->SetFloatArrayRegion(array, 0, 1, (jfloat*) aVariant.val.p);
env->SetFloatArrayRegion(array, 0, 1, (jfloat*) aVariant.val.p);
aJValue.l = array;
} else {
aJValue.l = nsnull;
@@ -719,14 +717,13 @@ nsJavaXPTCStub::SetupJavaParams(const nsXPTParamInfo &aParamInfo,
aMethodSig.Append('D');
} else { // 'inout' & 'out'
if (aVariant.val.p) {
jdoubleArray array = mJavaEnv->NewDoubleArray(1);
jdoubleArray array = env->NewDoubleArray(1);
if (!array) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
}
mJavaEnv->SetDoubleArrayRegion(array, 0, 1,
(jdouble*) aVariant.val.p);
env->SetDoubleArrayRegion(array, 0, 1, (jdouble*) aVariant.val.p);
aJValue.l = array;
} else {
aJValue.l = nsnull;
@@ -743,14 +740,13 @@ nsJavaXPTCStub::SetupJavaParams(const nsXPTParamInfo &aParamInfo,
aMethodSig.Append('Z');
} else { // 'inout' & 'out'
if (aVariant.val.p) {
jbooleanArray array = mJavaEnv->NewBooleanArray(1);
jbooleanArray array = env->NewBooleanArray(1);
if (!array) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
}
mJavaEnv->SetBooleanArrayRegion(array, 0, 1,
(jboolean*) aVariant.val.p);
env->SetBooleanArrayRegion(array, 0, 1, (jboolean*) aVariant.val.p);
aJValue.l = array;
} else {
aJValue.l = nsnull;
@@ -771,13 +767,13 @@ nsJavaXPTCStub::SetupJavaParams(const nsXPTParamInfo &aParamInfo,
aMethodSig.Append('C');
} else { // 'inout' & 'out'
if (aVariant.val.p) {
jcharArray array = mJavaEnv->NewCharArray(1);
jcharArray array = env->NewCharArray(1);
if (!array) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
}
mJavaEnv->SetCharArrayRegion(array, 0, 1, (jchar*) aVariant.val.p);
env->SetCharArrayRegion(array, 0, 1, (jchar*) aVariant.val.p);
aJValue.l = array;
} else {
aJValue.l = nsnull;
@@ -801,10 +797,10 @@ nsJavaXPTCStub::SetupJavaParams(const nsXPTParamInfo &aParamInfo,
jobject str;
if (ptr) {
if (tag == nsXPTType::T_CHAR_STR) {
str = mJavaEnv->NewStringUTF((const char*) ptr);
str = env->NewStringUTF((const char*) ptr);
} else {
const PRUnichar* buf = (const PRUnichar*) ptr;
str = mJavaEnv->NewString(buf, nsCRT::strlen(buf));
str = env->NewString(buf, nsCRT::strlen(buf));
}
if (!str) {
rv = NS_ERROR_OUT_OF_MEMORY;
@@ -819,7 +815,7 @@ nsJavaXPTCStub::SetupJavaParams(const nsXPTParamInfo &aParamInfo,
aMethodSig.AppendLiteral("Ljava/lang/String;");
} else { // 'inout' & 'out'
if (aVariant.val.p) {
aJValue.l = mJavaEnv->NewObjectArray(1, stringClass, str);
aJValue.l = env->NewObjectArray(1, stringClass, str);
if (aJValue.l == nsnull) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
@@ -846,7 +842,7 @@ nsJavaXPTCStub::SetupJavaParams(const nsXPTParamInfo &aParamInfo,
if (iid) {
char* iid_str = iid->ToString();
if (iid_str) {
str = mJavaEnv->NewStringUTF(iid_str);
str = env->NewStringUTF(iid_str);
}
if (!iid_str || !str) {
rv = NS_ERROR_OUT_OF_MEMORY;
@@ -862,7 +858,7 @@ nsJavaXPTCStub::SetupJavaParams(const nsXPTParamInfo &aParamInfo,
aMethodSig.AppendLiteral("Ljava/lang/String;");
} else { // 'inout' & 'out'
if (aVariant.val.p) {
aJValue.l = mJavaEnv->NewObjectArray(1, stringClass, str);
aJValue.l = env->NewObjectArray(1, stringClass, str);
if (aJValue.l == nsnull) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
@@ -903,7 +899,7 @@ nsJavaXPTCStub::SetupJavaParams(const nsXPTParamInfo &aParamInfo,
jobject java_stub = nsnull;
if (xpcom_obj) {
// Get matching Java object for given xpcom object
rv = GetNewOrUsedJavaObject(mJavaEnv, xpcom_obj, iid, &java_stub);
rv = GetNewOrUsedJavaObject(env, xpcom_obj, iid, &java_stub);
if (NS_FAILED(rv))
break;
}
@@ -912,7 +908,7 @@ nsJavaXPTCStub::SetupJavaParams(const nsXPTParamInfo &aParamInfo,
aJValue.l = java_stub;
} else { // 'inout' & 'out'
if (aVariant.val.p) {
aJValue.l = mJavaEnv->NewObjectArray(1, nsISupportsClass, java_stub);
aJValue.l = env->NewObjectArray(1, nsISupportsClass, java_stub);
if (aJValue.l == nsnull) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
@@ -948,7 +944,7 @@ nsJavaXPTCStub::SetupJavaParams(const nsXPTParamInfo &aParamInfo,
jstring jstr;
if (str) {
jstr = mJavaEnv->NewString(str->get(), str->Length());
jstr = env->NewString(str->get(), str->Length());
if (!jstr) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
@@ -962,7 +958,7 @@ nsJavaXPTCStub::SetupJavaParams(const nsXPTParamInfo &aParamInfo,
aMethodSig.AppendLiteral("Ljava/lang/String;");
} else { // 'inout' & 'out'
if (aVariant.val.p) {
aJValue.l = mJavaEnv->NewObjectArray(1, stringClass, jstr);
aJValue.l = env->NewObjectArray(1, stringClass, jstr);
if (aJValue.l == nsnull) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
@@ -988,7 +984,7 @@ nsJavaXPTCStub::SetupJavaParams(const nsXPTParamInfo &aParamInfo,
jstring jstr;
if (str) {
jstr = mJavaEnv->NewStringUTF(str->get());
jstr = env->NewStringUTF(str->get());
if (!jstr) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
@@ -1002,7 +998,7 @@ nsJavaXPTCStub::SetupJavaParams(const nsXPTParamInfo &aParamInfo,
aMethodSig.AppendLiteral("Ljava/lang/String;");
} else { // 'inout' & 'out'
if (aVariant.val.p) {
aJValue.l = mJavaEnv->NewObjectArray(1, stringClass, jstr);
aJValue.l = env->NewObjectArray(1, stringClass, jstr);
if (aJValue.l == nsnull) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
@@ -1023,13 +1019,13 @@ nsJavaXPTCStub::SetupJavaParams(const nsXPTParamInfo &aParamInfo,
aMethodSig.Append('I');
} else { // 'inout' & 'out'
if (aVariant.val.p) {
jintArray array = mJavaEnv->NewIntArray(1);
jintArray array = env->NewIntArray(1);
if (!array) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
}
mJavaEnv->SetIntArrayRegion(array, 0, 1, (jint*) aVariant.val.p);
env->SetIntArrayRegion(array, 0, 1, (jint*) aVariant.val.p);
aJValue.l = array;
} else {
aJValue.l = nsnull;
@@ -1168,6 +1164,7 @@ nsJavaXPTCStub::FinalizeJavaParams(const nsXPTParamInfo &aParamInfo,
nsXPTCMiniVariant &aVariant, jvalue &aJValue)
{
nsresult rv = NS_OK;
JNIEnv* env = GetJNIEnv();
const nsXPTType &type = aParamInfo.GetType();
PRUint8 tag = type.TagPart();
@@ -1175,12 +1172,14 @@ nsJavaXPTCStub::FinalizeJavaParams(const nsXPTParamInfo &aParamInfo,
{
case nsXPTType::T_I8:
{
jbyte value;
if (aParamInfo.IsRetval()) { // 'retval'
*((PRInt8 *) aVariant.val.p) = aJValue.b;
value = aJValue.b;
} else if (aJValue.l) { // 'inout' & 'out'
mJavaEnv->GetByteArrayRegion((jbyteArray) aJValue.l, 0, 1,
(PRInt8 *) aVariant.val.p);
env->GetByteArrayRegion((jbyteArray) aJValue.l, 0, 1, &value);
}
if (aVariant.val.p)
*((PRInt8 *) aVariant.val.p) = value;
}
break;
@@ -1191,7 +1190,7 @@ nsJavaXPTCStub::FinalizeJavaParams(const nsXPTParamInfo &aParamInfo,
if (aParamInfo.IsRetval()) { // 'retval'
value = aJValue.s;
} else if (aJValue.l) { // 'inout' & 'out'
mJavaEnv->GetShortArrayRegion((jshortArray) aJValue.l, 0, 1, &value);
env->GetShortArrayRegion((jshortArray) aJValue.l, 0, 1, &value);
}
if (aVariant.val.p) {
@@ -1210,7 +1209,7 @@ nsJavaXPTCStub::FinalizeJavaParams(const nsXPTParamInfo &aParamInfo,
if (aParamInfo.IsRetval()) { // 'retval'
value = aJValue.i;
} else if (aJValue.l) { // 'inout' & 'out'
mJavaEnv->GetIntArrayRegion((jintArray) aJValue.l, 0, 1, &value);
env->GetIntArrayRegion((jintArray) aJValue.l, 0, 1, &value);
}
if (aVariant.val.p) {
@@ -1229,7 +1228,7 @@ nsJavaXPTCStub::FinalizeJavaParams(const nsXPTParamInfo &aParamInfo,
if (aParamInfo.IsRetval()) { // 'retval'
value = aJValue.j;
} else if (aJValue.l) { // 'inout' & 'out'
mJavaEnv->GetLongArrayRegion((jlongArray) aJValue.l, 0, 1, &value);
env->GetLongArrayRegion((jlongArray) aJValue.l, 0, 1, &value);
}
if (aVariant.val.p) {
@@ -1246,8 +1245,8 @@ nsJavaXPTCStub::FinalizeJavaParams(const nsXPTParamInfo &aParamInfo,
if (aParamInfo.IsRetval()) { // 'retval'
*((float *) aVariant.val.p) = aJValue.f;
} else if (aJValue.l) { // 'inout' & 'out'
mJavaEnv->GetFloatArrayRegion((jfloatArray) aJValue.l, 0, 1,
(jfloat*) aVariant.val.p);
env->GetFloatArrayRegion((jfloatArray) aJValue.l, 0, 1,
(jfloat*) aVariant.val.p);
}
}
break;
@@ -1260,7 +1259,7 @@ nsJavaXPTCStub::FinalizeJavaParams(const nsXPTParamInfo &aParamInfo,
if (aParamInfo.IsRetval()) { // 'retval'
value = aJValue.d;
} else if (aJValue.l) { // 'inout' & 'out'
mJavaEnv->GetDoubleArrayRegion((jdoubleArray) aJValue.l, 0, 1, &value);
env->GetDoubleArrayRegion((jdoubleArray) aJValue.l, 0, 1, &value);
}
if (aVariant.val.p) {
@@ -1277,8 +1276,8 @@ nsJavaXPTCStub::FinalizeJavaParams(const nsXPTParamInfo &aParamInfo,
if (aParamInfo.IsRetval()) { // 'retval'
*((PRBool *) aVariant.val.p) = aJValue.z;
} else if (aJValue.l) { // 'inout' & 'out'
mJavaEnv->GetBooleanArrayRegion((jbooleanArray) aJValue.l, 0, 1,
(jboolean*) aVariant.val.p);
env->GetBooleanArrayRegion((jbooleanArray) aJValue.l, 0, 1,
(jboolean*) aVariant.val.p);
}
}
break;
@@ -1292,8 +1291,8 @@ nsJavaXPTCStub::FinalizeJavaParams(const nsXPTParamInfo &aParamInfo,
else
*((PRUnichar *) aVariant.val.p) = aJValue.c;
} else if (aJValue.l) { // 'inout' & 'out'
jchar* array = mJavaEnv->GetCharArrayElements((jcharArray) aJValue.l,
nsnull);
jchar* array = env->GetCharArrayElements((jcharArray) aJValue.l,
nsnull);
if (!array) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
@@ -1304,8 +1303,7 @@ nsJavaXPTCStub::FinalizeJavaParams(const nsXPTParamInfo &aParamInfo,
else
*((PRUnichar *) aVariant.val.p) = array[0];
mJavaEnv->ReleaseCharArrayElements((jcharArray) aJValue.l, array,
JNI_ABORT);
env->ReleaseCharArrayElements((jcharArray) aJValue.l, array, JNI_ABORT);
}
}
break;
@@ -1316,14 +1314,13 @@ nsJavaXPTCStub::FinalizeJavaParams(const nsXPTParamInfo &aParamInfo,
if (aParamInfo.IsRetval()) { // 'retval'
str = (jstring) aJValue.l;
} else { // 'inout' & 'out'
str = (jstring)
mJavaEnv->GetObjectArrayElement((jobjectArray) aJValue.l, 0);
str = (jstring) env->GetObjectArrayElement((jobjectArray) aJValue.l, 0);
}
char** variant = NS_STATIC_CAST(char**, aVariant.val.p);
if (str) {
// Get string buffer
const char* char_ptr = mJavaEnv->GetStringUTFChars(str, nsnull);
const char* char_ptr = env->GetStringUTFChars(str, nsnull);
if (!char_ptr) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
@@ -1345,7 +1342,7 @@ nsJavaXPTCStub::FinalizeJavaParams(const nsXPTParamInfo &aParamInfo,
}
// Release string buffer
mJavaEnv->ReleaseStringUTFChars(str, char_ptr);
env->ReleaseStringUTFChars(str, char_ptr);
} else {
// If we were passed in a string, delete it now, and set to null.
// (Only for 'inout' & 'out' params)
@@ -1363,14 +1360,13 @@ nsJavaXPTCStub::FinalizeJavaParams(const nsXPTParamInfo &aParamInfo,
if (aParamInfo.IsRetval()) { // 'retval'
str = (jstring) aJValue.l;
} else { // 'inout' & 'out'
str = (jstring)
mJavaEnv->GetObjectArrayElement((jobjectArray) aJValue.l, 0);
str = (jstring) env->GetObjectArrayElement((jobjectArray) aJValue.l, 0);
}
PRUnichar** variant = NS_STATIC_CAST(PRUnichar**, aVariant.val.p);
if (str) {
// Get string buffer
const jchar* wchar_ptr = mJavaEnv->GetStringChars(str, nsnull);
const jchar* wchar_ptr = env->GetStringChars(str, nsnull);
if (!wchar_ptr) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
@@ -1396,7 +1392,7 @@ nsJavaXPTCStub::FinalizeJavaParams(const nsXPTParamInfo &aParamInfo,
}
// Release string buffer
mJavaEnv->ReleaseStringChars(str, wchar_ptr);
env->ReleaseStringChars(str, wchar_ptr);
} else {
// If we were passed in a string, delete it now, and set to null.
// (Only for 'inout' & 'out' params)
@@ -1414,14 +1410,13 @@ nsJavaXPTCStub::FinalizeJavaParams(const nsXPTParamInfo &aParamInfo,
if (aParamInfo.IsRetval()) { // 'retval'
str = (jstring) aJValue.l;
} else { // 'inout' & 'out'
str = (jstring)
mJavaEnv->GetObjectArrayElement((jobjectArray) aJValue.l, 0);
str = (jstring) env->GetObjectArrayElement((jobjectArray) aJValue.l, 0);
}
nsID** variant = NS_STATIC_CAST(nsID**, aVariant.val.p);
if (str) {
// Get string buffer
const char* char_ptr = mJavaEnv->GetStringUTFChars(str, nsnull);
const char* char_ptr = env->GetStringUTFChars(str, nsnull);
if (!char_ptr) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
@@ -1445,7 +1440,7 @@ nsJavaXPTCStub::FinalizeJavaParams(const nsXPTParamInfo &aParamInfo,
}
// Release string buffer
mJavaEnv->ReleaseStringUTFChars(str, char_ptr);
env->ReleaseStringUTFChars(str, char_ptr);
} else {
// If we were passed in an nsID, delete it now, and set to null.
// (Free only 'inout' & 'out' params)
@@ -1464,7 +1459,7 @@ nsJavaXPTCStub::FinalizeJavaParams(const nsXPTParamInfo &aParamInfo,
if (aParamInfo.IsRetval()) { // 'retval'
java_obj = aJValue.l;
} else if (aJValue.l) { // 'inout' & 'out'
java_obj = mJavaEnv->GetObjectArrayElement((jobjectArray) aJValue.l, 0);
java_obj = env->GetObjectArrayElement((jobjectArray) aJValue.l, 0);
}
nsISupports** variant = NS_STATIC_CAST(nsISupports**, aVariant.val.p);
@@ -1490,7 +1485,7 @@ nsJavaXPTCStub::FinalizeJavaParams(const nsXPTParamInfo &aParamInfo,
nsISupports* xpcom_obj;
PRBool isXPTCStub;
rv = GetNewOrUsedXPCOMObject(mJavaEnv, java_obj, iid, &xpcom_obj,
rv = GetNewOrUsedXPCOMObject(env, java_obj, iid, &xpcom_obj,
&isXPTCStub);
if (NS_FAILED(rv))
break;
@@ -1503,7 +1498,7 @@ nsJavaXPTCStub::FinalizeJavaParams(const nsXPTParamInfo &aParamInfo,
NS_STATIC_CAST(nsXPTCStubBase*,
xpcom_obj));
nsJavaXPTCStubWeakRef* weakref;
weakref = new nsJavaXPTCStubWeakRef(mJavaEnv, java_obj, stub);
weakref = new nsJavaXPTCStubWeakRef(java_obj, stub);
if (!weakref) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
@@ -1553,14 +1548,13 @@ nsJavaXPTCStub::FinalizeJavaParams(const nsXPTParamInfo &aParamInfo,
if (aParamInfo.IsRetval()) { // 'retval'
str = (jstring) aJValue.l;
} else { // 'inout' & 'out'
str = (jstring)
mJavaEnv->GetObjectArrayElement((jobjectArray) aJValue.l, 0);
str = (jstring) env->GetObjectArrayElement((jobjectArray) aJValue.l, 0);
}
nsString** variant = NS_STATIC_CAST(nsString**, aVariant.val.p);
if (str) {
// Get string buffer
const jchar* wchar_ptr = mJavaEnv->GetStringChars(str, nsnull);
const jchar* wchar_ptr = env->GetStringChars(str, nsnull);
if (!wchar_ptr) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
@@ -1583,7 +1577,7 @@ nsJavaXPTCStub::FinalizeJavaParams(const nsXPTParamInfo &aParamInfo,
}
// release String buffer
mJavaEnv->ReleaseStringChars(str, wchar_ptr);
env->ReleaseStringChars(str, wchar_ptr);
} else {
// If we were passed in a string, delete it now, and set to null.
// (Free only 'inout' & 'out' params)
@@ -1602,14 +1596,13 @@ nsJavaXPTCStub::FinalizeJavaParams(const nsXPTParamInfo &aParamInfo,
if (aParamInfo.IsRetval()) { // 'retval'
str = (jstring) aJValue.l;
} else { // 'inout' & 'out'
str = (jstring)
mJavaEnv->GetObjectArrayElement((jobjectArray) aJValue.l, 0);
str = (jstring) env->GetObjectArrayElement((jobjectArray) aJValue.l, 0);
}
nsCString** variant = NS_STATIC_CAST(nsCString**, aVariant.val.p);
if (str) {
// Get string buffer
const char* char_ptr = mJavaEnv->GetStringUTFChars(str, nsnull);
const char* char_ptr = env->GetStringUTFChars(str, nsnull);
if (!char_ptr) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;
@@ -1632,7 +1625,7 @@ nsJavaXPTCStub::FinalizeJavaParams(const nsXPTParamInfo &aParamInfo,
}
// release String buffer
mJavaEnv->ReleaseStringUTFChars(str, char_ptr);
env->ReleaseStringUTFChars(str, char_ptr);
} else {
// If we were passed in a string, delete it now, and set to null.
// (Free only 'inout' & 'out' params)
@@ -1649,8 +1642,8 @@ nsJavaXPTCStub::FinalizeJavaParams(const nsXPTParamInfo &aParamInfo,
if (aParamInfo.IsRetval()) { // 'retval'
*((PRUint32 *) aVariant.val.p) = aJValue.i;
} else if (aJValue.l) { // 'inout' & 'out'
mJavaEnv->GetIntArrayRegion((jintArray) aJValue.l, 0, 1,
(jint*) aVariant.val.p);
env->GetIntArrayRegion((jintArray) aJValue.l, 0, 1,
(jint*) aVariant.val.p);
}
}
break;
@@ -1674,9 +1667,9 @@ nsJavaXPTCStub::GetWeakReference(nsIWeakReference** aInstancePtr)
if (!aInstancePtr)
return NS_ERROR_NULL_POINTER;
jobject javaObject = mJavaEnv->NewLocalRef(mJavaWeakRef);
jobject javaObject = GetJNIEnv()->NewLocalRef(mJavaWeakRef);
nsJavaXPTCStubWeakRef* weakref;
weakref = new nsJavaXPTCStubWeakRef(mJavaEnv, javaObject, this);
weakref = new nsJavaXPTCStubWeakRef(javaObject, this);
if (!weakref)
return NS_ERROR_OUT_OF_MEMORY;
@@ -1690,14 +1683,15 @@ nsJavaXPTCStub::GetWeakReference(nsIWeakReference** aInstancePtr)
jobject
nsJavaXPTCStub::GetJavaObject()
{
jobject javaObject = mJavaEnv->NewLocalRef(mJavaWeakRef);
JNIEnv* env = GetJNIEnv();
jobject javaObject = env->NewLocalRef(mJavaWeakRef);
#ifdef DEBUG_JAVAXPCOM
nsIID* iid;
mIInfo->GetInterfaceIID(&iid);
char* iid_str = iid->ToString();
LOG(("< nsJavaXPTCStub (Java=%08x | XPCOM=%08x | IID=%s)\n",
(PRUint32) mJavaEnv->CallIntMethod(javaObject, hashCodeMID),
(PRUint32) env->CallIntMethod(javaObject, hashCodeMID),
(PRUint32) this, iid_str));
PR_Free(iid_str);
nsMemory::Free(iid);