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

git-svn-id: svn://10.0.0.236/trunk@173011 18797224-902f-48f8-a5cc-f745e15eee43
This commit is contained in:
pedemont%us.ibm.com 2005-05-03 20:15:35 +00:00
parent eae3973c8d
commit 87845830b9
10 changed files with 215 additions and 190 deletions

View File

@ -15,7 +15,7 @@
*
* The Initial Developer of the Original Code is
* IBM Corporation.
* Portions created by the Initial Developer are Copyright (C) 2004
* Portions created by the Initial Developer are Copyright (C) 2005
* IBM Corporation. All Rights Reserved.
*
* Contributor(s):
@ -41,16 +41,14 @@
#include "nsISimpleEnumerator.h"
nsAppFileLocProviderProxy::nsAppFileLocProviderProxy(JNIEnv* env,
jobject aJavaObject)
: mJavaEnv(env)
nsAppFileLocProviderProxy::nsAppFileLocProviderProxy(jobject aJavaObject)
{
mJavaLocProvider = env->NewGlobalRef(aJavaObject);
mJavaLocProvider = GetJNIEnv()->NewGlobalRef(aJavaObject);
}
nsAppFileLocProviderProxy::~nsAppFileLocProviderProxy()
{
mJavaEnv->DeleteGlobalRef(mJavaLocProvider);
GetJNIEnv()->DeleteGlobalRef(mJavaLocProvider);
}
NS_IMPL_ISUPPORTS2(nsAppFileLocProviderProxy,
@ -65,37 +63,36 @@ nsAppFileLocProviderProxy::GetFile(const char* aProp, PRBool* aIsPersistant,
nsIFile** aResult)
{
// Setup params for calling Java function
jstring prop = mJavaEnv->NewStringUTF(aProp);
JNIEnv* env = GetJNIEnv();
jstring prop = env->NewStringUTF(aProp);
if (!prop)
return NS_ERROR_OUT_OF_MEMORY;
jbooleanArray persistant = mJavaEnv->NewBooleanArray(1);
jbooleanArray persistant = env->NewBooleanArray(1);
if (!persistant)
return NS_ERROR_OUT_OF_MEMORY;
// Create method ID
jmethodID mid = nsnull;
jclass clazz = mJavaEnv->GetObjectClass(mJavaLocProvider);
jclass clazz = env->GetObjectClass(mJavaLocProvider);
if (clazz) {
mid = mJavaEnv->GetMethodID(clazz, "getFile",
"(Ljava/lang/String;[Z)Ljava/io/File;");
mid = env->GetMethodID(clazz, "getFile",
"(Ljava/lang/String;[Z)Ljava/io/File;");
}
if (!mid)
return NS_ERROR_FAILURE;
// Call Java function
jobject javaFile = nsnull;
javaFile = mJavaEnv->CallObjectMethod(mJavaLocProvider, mid, prop,
persistant);
if (javaFile == nsnull || mJavaEnv->ExceptionCheck())
javaFile = env->CallObjectMethod(mJavaLocProvider, mid, prop, persistant);
if (javaFile == nsnull || env->ExceptionCheck())
return NS_ERROR_FAILURE;
// Set boolean output value
mJavaEnv->GetBooleanArrayRegion(persistant, 0, 1, (jboolean*) aIsPersistant);
env->GetBooleanArrayRegion(persistant, 0, 1, (jboolean*) aIsPersistant);
// Set nsIFile result value
nsCOMPtr<nsILocalFile> localFile;
nsresult rv = File_to_nsILocalFile(mJavaEnv, javaFile,
getter_AddRefs(localFile));
nsresult rv = File_to_nsILocalFile(env, javaFile, getter_AddRefs(localFile));
if (NS_SUCCEEDED(rv)) {
return localFile->QueryInterface(NS_GET_IID(nsIFile), (void**)aResult);
}
@ -111,10 +108,10 @@ class DirectoryEnumerator : public nsISimpleEnumerator
public:
NS_DECL_ISUPPORTS
DirectoryEnumerator(JNIEnv* env, jobjectArray aJavaFileArray)
: mJavaEnv(env)
, mIndex(0)
DirectoryEnumerator(jobjectArray aJavaFileArray)
: mIndex(0)
{
JNIEnv* env = GetJNIEnv();
mJavaFileArray = NS_STATIC_CAST(jobjectArray,
env->NewGlobalRef(aJavaFileArray));
mArraySize = env->GetArrayLength(aJavaFileArray);
@ -122,7 +119,7 @@ public:
~DirectoryEnumerator()
{
mJavaEnv->DeleteGlobalRef(mJavaFileArray);
GetJNIEnv()->DeleteGlobalRef(mJavaFileArray);
}
NS_IMETHOD HasMoreElements(PRBool* aResult)
@ -139,23 +136,23 @@ public:
{
nsresult rv = NS_ERROR_FAILURE;
jobject javaFile = mJavaEnv->GetObjectArrayElement(mJavaFileArray, mIndex++);
JNIEnv* env = GetJNIEnv();
jobject javaFile = env->GetObjectArrayElement(mJavaFileArray, mIndex++);
if (javaFile) {
nsCOMPtr<nsILocalFile> localFile;
rv = File_to_nsILocalFile(mJavaEnv, javaFile, getter_AddRefs(localFile));
mJavaEnv->DeleteLocalRef(javaFile);
rv = File_to_nsILocalFile(env, javaFile, getter_AddRefs(localFile));
env->DeleteLocalRef(javaFile);
if (NS_SUCCEEDED(rv)) {
return localFile->QueryInterface(NS_GET_IID(nsIFile), (void**)aResult);
}
}
mJavaEnv->ExceptionClear();
env->ExceptionClear();
return NS_ERROR_FAILURE;
}
private:
JNIEnv* mJavaEnv;
jobjectArray mJavaFileArray;
PRUint32 mArraySize;
PRUint32 mIndex;
@ -170,18 +167,19 @@ nsAppFileLocProviderProxy::GetFiles(const char* aProp,
nsresult rv = NS_OK;
// Setup params for calling Java function
jstring prop = mJavaEnv->NewStringUTF(aProp);
JNIEnv* env = GetJNIEnv();
jstring prop = env->NewStringUTF(aProp);
if (!prop)
rv = NS_ERROR_OUT_OF_MEMORY;
// Create method ID
jmethodID mid = nsnull;
if (NS_SUCCEEDED(rv)) {
jclass clazz = mJavaEnv->GetObjectClass(mJavaLocProvider);
jclass clazz = env->GetObjectClass(mJavaLocProvider);
if (clazz) {
mid = mJavaEnv->GetMethodID(clazz, "getFiles",
"(Ljava/lang/String;)[Ljava/io/File;");
mJavaEnv->DeleteLocalRef(clazz);
mid = env->GetMethodID(clazz, "getFiles",
"(Ljava/lang/String;)[Ljava/io/File;");
env->DeleteLocalRef(clazz);
}
if (!mid)
rv = NS_ERROR_FAILURE;
@ -190,23 +188,23 @@ nsAppFileLocProviderProxy::GetFiles(const char* aProp,
// Call Java function
jobject javaFileArray = nsnull;
if (NS_SUCCEEDED(rv)) {
javaFileArray = mJavaEnv->CallObjectMethod(mJavaLocProvider, mid, prop);
javaFileArray = env->CallObjectMethod(mJavaLocProvider, mid, prop);
// Handle any exception thrown by Java method.
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;
}
@ -224,8 +222,7 @@ nsAppFileLocProviderProxy::GetFiles(const char* aProp,
if (NS_SUCCEEDED(rv)) {
// Parse return value
*aResult = new DirectoryEnumerator(mJavaEnv,
NS_STATIC_CAST(jobjectArray,
*aResult = new DirectoryEnumerator(NS_STATIC_CAST(jobjectArray,
javaFileArray));
NS_ADDREF(*aResult);
return NS_OK;
@ -233,7 +230,7 @@ nsAppFileLocProviderProxy::GetFiles(const char* aProp,
// Handle error conditions
*aResult = nsnull;
mJavaEnv->ExceptionClear();
env->ExceptionClear();
return rv;
}

View File

@ -15,7 +15,7 @@
*
* The Initial Developer of the Original Code is
* IBM Corporation.
* Portions created by the Initial Developer are Copyright (C) 2004
* Portions created by the Initial Developer are Copyright (C) 2005
* IBM Corporation. All Rights Reserved.
*
* Contributor(s):
@ -45,7 +45,7 @@
class nsAppFileLocProviderProxy : public nsIDirectoryServiceProvider2
{
public:
nsAppFileLocProviderProxy(JNIEnv* env, jobject aJavaLocProvider);
nsAppFileLocProviderProxy(jobject aJavaLocProvider);
~nsAppFileLocProviderProxy();
NS_DECL_ISUPPORTS
@ -53,7 +53,6 @@ public:
NS_DECL_NSIDIRECTORYSERVICEPROVIDER2
private:
JNIEnv* mJavaEnv;
jobject mJavaLocProvider;
};

View File

@ -15,7 +15,7 @@
*
* The Initial Developer of the Original Code is
* IBM Corporation.
* Portions created by the Initial Developer are Copyright (C) 2004
* Portions created by the Initial Developer are Copyright (C) 2005
* IBM Corporation. All Rights Reserved.
*
* Contributor(s):
@ -71,7 +71,7 @@ InitEmbedding_Impl(JNIEnv* env, jobject aMozBinDirectory,
// create nsAppFileLocProviderProxy from given Java object
nsAppFileLocProviderProxy* provider = nsnull;
if (aAppFileLocProvider) {
provider = new nsAppFileLocProviderProxy(env, aAppFileLocProvider);
provider = new nsAppFileLocProviderProxy(aAppFileLocProvider);
if (!provider)
return NS_ERROR_OUT_OF_MEMORY;
}
@ -134,7 +134,7 @@ InitXPCOM_Impl(JNIEnv* env, jobject aMozBinDirectory,
// create nsAppFileLocProviderProxy from given Java object
nsAppFileLocProviderProxy* provider = nsnull;
if (aAppFileLocProvider) {
provider = new nsAppFileLocProviderProxy(env, aAppFileLocProvider);
provider = new nsAppFileLocProviderProxy(aAppFileLocProvider);
if (!provider)
return NS_ERROR_OUT_OF_MEMORY;
}

View File

@ -734,7 +734,7 @@ SetupParams(JNIEnv *env, const jobject aParam, PRUint8 aType, PRBool aIsOut,
NS_STATIC_CAST(nsXPTCStubBase*,
xpcom_obj));
nsJavaXPTCStubWeakRef* weakref;
weakref = new nsJavaXPTCStubWeakRef(env, java_obj, stub);
weakref = new nsJavaXPTCStubWeakRef(java_obj, stub);
if (!weakref) {
rv = NS_ERROR_OUT_OF_MEMORY;
break;

View File

@ -47,6 +47,9 @@
/* Java JNI globals */
JavaVM* gCachedJVM = nsnull;
jclass booleanClass = nsnull;
jclass charClass = nsnull;
jclass byteClass = nsnull;
@ -93,6 +96,24 @@ PRBool gJavaXPCOMInitialized = PR_FALSE;
PRLock* gJavaXPCOMLock = nsnull;
/******************************
* JNI Load & Unload
******************************/
extern "C" JX_EXPORT jint JNICALL
JNI_OnLoad(JavaVM* vm, void* reserved)
{
// Save pointer to JavaVM, which is valid across threads.
gCachedJVM = vm;
// Let the JVM know that we are using JDK 1.2 JNI features.
return JNI_VERSION_1_2;
}
extern "C" JX_EXPORT void JNICALL
JNI_OnUnload(JavaVM* vm, void* reserved)
{
}
/******************************
* InitializeJavaGlobals
******************************/
@ -777,7 +798,7 @@ GetNewOrUsedXPCOMObject(JNIEnv* env, jobject aJavaObject, const nsIID& aIID,
return rv;
// Create XPCOM stub
stub = new nsJavaXPTCStub(env, aJavaObject, iinfo);
stub = new nsJavaXPTCStub(aJavaObject, iinfo);
if (!stub) {
return NS_ERROR_OUT_OF_MEMORY;
}
@ -849,6 +870,16 @@ GetIIDForMethodParam(nsIInterfaceInfo *iinfo, const nsXPTMethodInfo *methodInfo,
* JNI helper functions
*******************************/
JNIEnv*
GetJNIEnv()
{
JNIEnv* env;
jint rc = gCachedJVM->GetEnv((void**) &env, JNI_VERSION_1_2);
NS_ASSERTION(rc == JNI_OK && env != nsnull,
"Current thread not attached to given JVM instance");
return env;
}
void
ThrowException(JNIEnv* env, const nsresult aErrorCode, const char* aMessage)
{

View File

@ -302,6 +302,15 @@ nsresult GetIIDForMethodParam(nsIInterfaceInfo *iinfo,
* JNI helper functions
*******************************/
/**
* Returns a pointer to the appropriate JNIEnv structure. This function is
* useful in callbacks or other functions that are not called directly from
* Java and therefore do not have the JNIEnv structure passed in.
*
* @return pointer to JNIEnv structure for current thread
*/
JNIEnv* GetJNIEnv();
/**
* Constructs and throws an exception. Some error codes (such as
* NS_ERROR_OUT_OF_MEMORY) are handled by the appropriate Java exception/error.

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);

View File

@ -15,7 +15,7 @@
*
* The Initial Developer of the Original Code is
* IBM Corporation.
* Portions created by the Initial Developer are Copyright (C) 2004
* Portions created by the Initial Developer are Copyright (C) 2005
* IBM Corporation. All Rights Reserved.
*
* Contributor(s):
@ -60,8 +60,7 @@ public:
NS_DECL_NSISUPPORTSWEAKREFERENCE
NS_DEFINE_STATIC_IID_ACCESSOR(NS_JAVAXPTCSTUB_IID)
nsJavaXPTCStub(JNIEnv* aJavaEnv, jobject aJavaObject,
nsIInterfaceInfo *aIInfo);
nsJavaXPTCStub(jobject aJavaObject, nsIInterfaceInfo *aIInfo);
virtual ~nsJavaXPTCStub();
@ -120,7 +119,6 @@ private:
jvalue &aJValue);
nsresult SetXPCOMRetval();
JNIEnv* mJavaEnv;
jweak mJavaWeakRef;
jobject mJavaStrongRef;
nsCOMPtr<nsIInterfaceInfo> mIInfo;

View File

@ -15,7 +15,7 @@
*
* The Initial Developer of the Original Code is
* IBM Corporation.
* Portions created by the Initial Developer are Copyright (C) 2004
* Portions created by the Initial Developer are Copyright (C) 2005
* IBM Corporation. All Rights Reserved.
*
* Contributor(s):
@ -56,17 +56,16 @@
* finding an XPTCStub for the required IID.
*/
nsJavaXPTCStubWeakRef::nsJavaXPTCStubWeakRef(JNIEnv* env, jobject aJavaObject,
nsJavaXPTCStubWeakRef::nsJavaXPTCStubWeakRef(jobject aJavaObject,
nsJavaXPTCStub* aXPTCStub)
: mJavaEnv(env)
, mXPTCStub(aXPTCStub)
: mXPTCStub(aXPTCStub)
{
mWeakRef = mJavaEnv->NewWeakGlobalRef(aJavaObject);
mWeakRef = GetJNIEnv()->NewWeakGlobalRef(aJavaObject);
}
nsJavaXPTCStubWeakRef::~nsJavaXPTCStubWeakRef()
{
mJavaEnv->DeleteWeakGlobalRef(mWeakRef);
GetJNIEnv()->DeleteWeakGlobalRef(mWeakRef);
mXPTCStub->ReleaseWeakRef();
}
@ -83,7 +82,7 @@ nsJavaXPTCStubWeakRef::QueryReferent(const nsIID& aIID, void** aInstancePtr)
// Is weak ref still valid?
// We create a strong local ref to make sure Java object isn't garbage
// collected during this call.
jobject javaObject = mJavaEnv->NewLocalRef(mWeakRef);
jobject javaObject = GetJNIEnv()->NewLocalRef(mWeakRef);
if (!javaObject)
return NS_ERROR_NULL_POINTER;

View File

@ -15,7 +15,7 @@
*
* The Initial Developer of the Original Code is
* IBM Corporation.
* Portions created by the Initial Developer are Copyright (C) 2004
* Portions created by the Initial Developer are Copyright (C) 2005
* IBM Corporation. All Rights Reserved.
*
* Contributor(s):
@ -50,14 +50,12 @@ class nsJavaXPTCStub;
class nsJavaXPTCStubWeakRef : public nsIWeakReference
{
public:
nsJavaXPTCStubWeakRef(JNIEnv* env, jobject aJavaObject,
nsJavaXPTCStub* aXPTCStub);
nsJavaXPTCStubWeakRef(jobject aJavaObject, nsJavaXPTCStub* aXPTCStub);
virtual ~nsJavaXPTCStubWeakRef();
NS_DECL_ISUPPORTS
NS_DECL_NSIWEAKREFERENCE
protected:
JNIEnv* mJavaEnv;
jweak mWeakRef;
nsJavaXPTCStub* mXPTCStub;
};