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:
parent
eae3973c8d
commit
87845830b9
@ -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;
|
||||
}
|
||||
|
||||
|
||||
@ -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;
|
||||
};
|
||||
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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)
|
||||
{
|
||||
|
||||
@ -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.
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
|
||||
|
||||
@ -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;
|
||||
};
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user