mirror of
https://bitbucket.org/theswgsource/src-1.2.git
synced 2026-07-31 01:15:48 -04:00
1127 lines
31 KiB
C++
Executable File
1127 lines
31 KiB
C++
Executable File
//========================================================================
|
|
//
|
|
// JNIWrappers.cpp - Classes and functions to wrap the JNI interface
|
|
//
|
|
// copyright 2004 Sony Online Entertainment
|
|
//
|
|
//========================================================================
|
|
|
|
#include "serverScript/FirstServerScript.h"
|
|
#include "serverScript/JNIWrappers.h"
|
|
#include "serverScript/JavaLibrary.h"
|
|
#include "sharedFoundation/Crc.h"
|
|
|
|
|
|
const LocalRefParamPtr LocalRefParam::cms_nullPtr(new LocalRefParam(static_cast<jobject>(0)));
|
|
const LocalArrayRefParamPtr LocalArrayRefParam::cms_nullPtr(new LocalArrayRefParam(static_cast<jarray>(0)));
|
|
const LocalObjectArrayRefParamPtr LocalObjectArrayRefParam::cms_nullPtr(new LocalObjectArrayRefParam(static_cast<jobjectArray>(0)));
|
|
const LocalRefPtr LocalRef::cms_nullPtr(new LocalRef(static_cast<jobject>(0)));
|
|
const LocalArrayRefPtr LocalArrayRef::cms_nullPtr(new LocalArrayRef(static_cast<jarray>(0)));
|
|
const LocalObjectArrayRefPtr LocalObjectArrayRef::cms_nullPtr(new LocalObjectArrayRef(static_cast<jobjectArray>(0)));
|
|
const LocalByteArrayRefPtr LocalByteArrayRef::cms_nullPtr(new LocalByteArrayRef(static_cast<jbyteArray>(0)));
|
|
const LocalIntArrayRefPtr LocalIntArrayRef::cms_nullPtr(new LocalIntArrayRef(static_cast<jintArray>(0)));
|
|
const LocalFloatArrayRefPtr LocalFloatArrayRef::cms_nullPtr(new LocalFloatArrayRef(static_cast<jfloatArray>(0)));
|
|
const LocalBooleanArrayRefPtr LocalBooleanArrayRef::cms_nullPtr(new LocalBooleanArrayRef(static_cast<jbooleanArray>(0)));
|
|
const LocalLongArrayRefPtr LocalLongArrayRef::cms_nullPtr(new LocalLongArrayRef(static_cast<jlongArray>(0)));
|
|
const GlobalRefPtr GlobalRef::cms_nullPtr(new GlobalRef(*LocalRefParam::cms_nullPtr));
|
|
const GlobalArrayRefPtr GlobalArrayRef::cms_nullPtr(new GlobalArrayRef(*LocalObjectArrayRefParam::cms_nullPtr));
|
|
const JavaStringParamPtr JavaStringParam::cms_nullPtr(new JavaStringParam(static_cast<jstring>(0)));
|
|
const JavaStringPtr JavaString::cms_nullPtr(new JavaString(static_cast<jstring>(0)));
|
|
const JavaDictionaryPtr JavaDictionary::cms_nullPtr(new JavaDictionary(static_cast<jobject>(0)));
|
|
|
|
|
|
//========================================================================
|
|
|
|
namespace JNIWrappersNamespace
|
|
{
|
|
|
|
jboolean isInstanceOf(const LocalRefParam & object, jclass clazz)
|
|
{
|
|
if (object.getValue() != 0)
|
|
return JavaLibrary::getEnv()->IsInstanceOf(object.getValue(), clazz);
|
|
return JNI_FALSE;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
|
|
|
jsize getArrayLength(const LocalArrayRefParam & array)
|
|
{
|
|
if (array.getValue() != 0)
|
|
return JavaLibrary::getEnv()->GetArrayLength(array.getValue());
|
|
return 0;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
|
|
|
jsize getStringLength(const JavaStringParam & string)
|
|
{
|
|
if (string.getValue() != 0)
|
|
return JavaLibrary::getEnv()->GetStringLength(string.getValue());
|
|
return 0;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
|
|
|
LocalRefPtr allocObject(jclass clazz)
|
|
{
|
|
LocalRefPtr result(new LocalRef(JavaLibrary::getEnv()->AllocObject(clazz)));
|
|
if (result->getValue() == 0)
|
|
return LocalRef::cms_nullPtr;
|
|
return result;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
|
|
|
LocalRefPtr createNewObject(jclass clazz, jmethodID constructorID, ...)
|
|
{
|
|
va_list marker;
|
|
va_start(marker, constructorID);
|
|
|
|
LocalRefPtr result(new LocalRef(JavaLibrary::getEnv()->NewObjectV(clazz, constructorID, marker)));
|
|
|
|
va_end(marker);
|
|
|
|
if (result->getValue() == 0)
|
|
return LocalRef::cms_nullPtr;
|
|
return result;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
|
|
|
JavaStringPtr createNewString(const char * bytes)
|
|
{
|
|
if (bytes != NULL)
|
|
{
|
|
JavaStringPtr result(new JavaString(JavaLibrary::getEnv()->NewStringUTF(bytes)));
|
|
if (result->getValue() != 0)
|
|
return result;
|
|
}
|
|
return JavaString::cms_nullPtr;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
|
|
|
JavaStringPtr createNewString(const jchar * unicodeChars, jsize len)
|
|
{
|
|
if (unicodeChars != NULL && len >= 0)
|
|
{
|
|
JavaStringPtr result(new JavaString(JavaLibrary::getEnv()->NewString(unicodeChars, len)));
|
|
if (result->getValue() != 0)
|
|
return result;
|
|
}
|
|
return JavaString::cms_nullPtr;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
|
|
|
JavaDictionaryPtr createNewDictionary()
|
|
{
|
|
JavaDictionaryPtr result(new JavaDictionary(JavaLibrary::getEnv()->NewObject(JavaLibrary::ms_clsDictionary, JavaLibrary::ms_midDictionary)));
|
|
if (result->getValue() != 0)
|
|
return result;
|
|
return JavaDictionary::cms_nullPtr;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
|
|
|
LocalObjectArrayRefPtr createNewObjectArray(jsize length, jclass clazz)
|
|
{
|
|
LocalObjectArrayRefPtr result(new LocalObjectArrayRef(JavaLibrary::getEnv()->NewObjectArray(length, clazz, 0)));
|
|
if (result->getValue() == 0)
|
|
return LocalObjectArrayRef::cms_nullPtr;
|
|
return result;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
|
|
|
LocalByteArrayRefPtr createNewByteArray(jsize length)
|
|
{
|
|
LocalByteArrayRefPtr result(new LocalByteArrayRef(JavaLibrary::getEnv()->NewByteArray(length)));
|
|
if (result->getValue() == 0)
|
|
return LocalByteArrayRef::cms_nullPtr;
|
|
return result;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
|
|
|
LocalIntArrayRefPtr createNewIntArray(jsize length)
|
|
{
|
|
LocalIntArrayRefPtr result(new LocalIntArrayRef(JavaLibrary::getEnv()->NewIntArray(length)));
|
|
if (result->getValue() == 0)
|
|
return LocalIntArrayRef::cms_nullPtr;
|
|
return result;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
|
|
|
LocalFloatArrayRefPtr createNewFloatArray(jsize length)
|
|
{
|
|
LocalFloatArrayRefPtr result(new LocalFloatArrayRef(JavaLibrary::getEnv()->NewFloatArray(length)));
|
|
if (result->getValue() == 0)
|
|
return LocalFloatArrayRef::cms_nullPtr;
|
|
return result;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
|
|
|
LocalBooleanArrayRefPtr createNewBooleanArray(jsize length)
|
|
{
|
|
LocalBooleanArrayRefPtr result(new LocalBooleanArrayRef(JavaLibrary::getEnv()->NewBooleanArray(length)));
|
|
if (result->getValue() == 0)
|
|
return LocalBooleanArrayRef::cms_nullPtr;
|
|
return result;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
|
|
|
LocalLongArrayRefPtr createNewLongArray(jsize length)
|
|
{
|
|
LocalLongArrayRefPtr result(new LocalLongArrayRef(JavaLibrary::getEnv()->NewLongArray(length)));
|
|
if (result->getValue() == 0)
|
|
return LocalLongArrayRef::cms_nullPtr;
|
|
return result;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
|
|
|
LocalRefPtr callObjectMethod(const LocalRefParam & object, jmethodID methodID, ...)
|
|
{
|
|
if (object.getValue() != 0)
|
|
{
|
|
va_list marker;
|
|
va_start(marker, methodID);
|
|
|
|
LocalRefPtr result(new LocalRef(JavaLibrary::getEnv()->CallObjectMethodV(object.getValue(), methodID, marker)));
|
|
|
|
va_end(marker);
|
|
|
|
if (result->getValue() != 0)
|
|
return result;
|
|
}
|
|
return LocalRef::cms_nullPtr;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
|
|
|
LocalObjectArrayRefPtr callObjectArrayMethod(const LocalRefParam & object, jmethodID methodID, ...)
|
|
{
|
|
if (object.getValue() != 0)
|
|
{
|
|
va_list marker;
|
|
va_start(marker, methodID);
|
|
|
|
LocalObjectArrayRefPtr result(new LocalObjectArrayRef(static_cast<jobjectArray>(JavaLibrary::getEnv()->CallObjectMethodV(object.getValue(), methodID, marker))));
|
|
|
|
va_end(marker);
|
|
|
|
if (result->getValue() != 0)
|
|
return result;
|
|
}
|
|
return LocalObjectArrayRef::cms_nullPtr;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
|
|
|
LocalByteArrayRefPtr callByteArrayMethod(const LocalRefParam & object, jmethodID methodID, ...)
|
|
{
|
|
if (object.getValue() != 0)
|
|
{
|
|
va_list marker;
|
|
va_start(marker, methodID);
|
|
|
|
LocalByteArrayRefPtr result(new LocalByteArrayRef(static_cast<jbyteArray>(JavaLibrary::getEnv()->CallObjectMethodV(object.getValue(), methodID, marker))));
|
|
|
|
va_end(marker);
|
|
|
|
if (result->getValue() != 0)
|
|
return result;
|
|
}
|
|
return LocalByteArrayRef::cms_nullPtr;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
|
|
|
jint callIntMethod(const LocalRefParam & object, jmethodID methodID, ...)
|
|
{
|
|
if (object.getValue() != 0)
|
|
{
|
|
va_list marker;
|
|
va_start(marker, methodID);
|
|
|
|
jint result = JavaLibrary::getEnv()->CallIntMethodV(object.getValue(), methodID, marker);
|
|
|
|
va_end(marker);
|
|
|
|
return result;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
|
|
|
jlong callLongMethod(const LocalRefParam & object, jmethodID methodID, ...)
|
|
{
|
|
if (object.getValue() != 0)
|
|
{
|
|
va_list marker;
|
|
va_start(marker, methodID);
|
|
|
|
jlong result = JavaLibrary::getEnv()->CallLongMethodV(object.getValue(), methodID, marker);
|
|
|
|
va_end(marker);
|
|
|
|
return result;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
|
|
|
jfloat callFloatMethod(const LocalRefParam & object, jmethodID methodID, ...)
|
|
{
|
|
if (object.getValue() != 0)
|
|
{
|
|
va_list marker;
|
|
va_start(marker, methodID);
|
|
|
|
jfloat result = JavaLibrary::getEnv()->CallFloatMethodV(object.getValue(), methodID, marker);
|
|
|
|
va_end(marker);
|
|
|
|
return result;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
|
|
|
jboolean callBooleanMethod(const LocalRefParam & object, jmethodID methodID, ...)
|
|
{
|
|
if (object.getValue() != 0)
|
|
{
|
|
va_list marker;
|
|
va_start(marker, methodID);
|
|
|
|
jboolean result = JavaLibrary::getEnv()->CallBooleanMethodV(object.getValue(), methodID, marker);
|
|
|
|
va_end(marker);
|
|
|
|
return result;
|
|
}
|
|
return JNI_FALSE;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
|
|
|
void callVoidMethod(const LocalRefParam & object, jmethodID methodID, ...)
|
|
{
|
|
if (object.getValue() != 0)
|
|
{
|
|
va_list marker;
|
|
va_start(marker, methodID);
|
|
|
|
JavaLibrary::getEnv()->CallVoidMethodV(object.getValue(), methodID, marker);
|
|
|
|
va_end(marker);
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
|
|
|
jboolean callNonvirtualBooleanMethod(const LocalRefParam & object, jclass clazz, jmethodID methodID, ...)
|
|
{
|
|
if (object.getValue() != 0)
|
|
{
|
|
va_list marker;
|
|
va_start(marker, methodID);
|
|
|
|
jboolean result = JavaLibrary::getEnv()->CallNonvirtualBooleanMethodV(object.getValue(), clazz, methodID, marker);
|
|
|
|
va_end(marker);
|
|
|
|
return result;
|
|
}
|
|
return JNI_FALSE;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
|
|
|
void callStaticVoidMethod(jclass clazz, jmethodID methodID, ...)
|
|
{
|
|
va_list marker;
|
|
va_start(marker, methodID);
|
|
|
|
JavaLibrary::getEnv()->CallStaticVoidMethodV(clazz, methodID, marker);
|
|
|
|
va_end(marker);
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
|
|
|
LocalRefPtr callStaticObjectMethod(jclass clazz, jmethodID methodID, ...)
|
|
{
|
|
va_list marker;
|
|
va_start(marker, methodID);
|
|
|
|
LocalRefPtr result(new LocalRef(JavaLibrary::getEnv()->CallStaticObjectMethodV(clazz, methodID, marker)));
|
|
|
|
va_end(marker);
|
|
|
|
if (result->getValue() == 0)
|
|
return LocalRef::cms_nullPtr;
|
|
return result;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
|
|
|
LocalObjectArrayRefPtr callStaticObjectArrayMethod(jclass clazz, jmethodID methodID, ...)
|
|
{
|
|
va_list marker;
|
|
va_start(marker, methodID);
|
|
|
|
LocalObjectArrayRefPtr result(new LocalObjectArrayRef(static_cast<jobjectArray>(JavaLibrary::getEnv()->CallStaticObjectMethodV(clazz, methodID, marker))));
|
|
|
|
va_end(marker);
|
|
|
|
if (result->getValue() == 0)
|
|
return LocalObjectArrayRef::cms_nullPtr;
|
|
return result;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
|
|
|
LocalByteArrayRefPtr callStaticByteArrayMethod(jclass clazz, jmethodID methodID, ...)
|
|
{
|
|
va_list marker;
|
|
va_start(marker, methodID);
|
|
|
|
LocalByteArrayRefPtr result(new LocalByteArrayRef(static_cast<jbyteArray>(JavaLibrary::getEnv()->CallStaticObjectMethodV(clazz, methodID, marker))));
|
|
|
|
va_end(marker);
|
|
|
|
if (result->getValue() == 0)
|
|
return LocalByteArrayRef::cms_nullPtr;
|
|
return result;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
|
|
|
LocalRefPtr getObjectArrayElement(const LocalObjectArrayRefParam & array, int index)
|
|
{
|
|
if (array.getValue() != 0 && index >= 0)
|
|
{
|
|
LocalRefPtr result(new LocalRef(JavaLibrary::getEnv()->GetObjectArrayElement(array.getValue(), static_cast<jsize>(index))));
|
|
if (result->getValue() != 0)
|
|
return result;
|
|
}
|
|
return LocalRef::cms_nullPtr;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
|
|
|
LocalRefPtr getObjectField(const LocalRefParam & object, jfieldID fieldID)
|
|
{
|
|
if (object.getValue() != 0)
|
|
{
|
|
LocalRefPtr result(new LocalRef(JavaLibrary::getEnv()->GetObjectField(object.getValue(), fieldID)));
|
|
if (result->getValue() != 0)
|
|
return result;
|
|
}
|
|
return LocalRef::cms_nullPtr;
|
|
}
|
|
//-----------------------------------------------------------------------
|
|
|
|
LocalObjectArrayRefPtr getArrayObjectField(const LocalRefParam & object, jfieldID fieldID)
|
|
{
|
|
if (object.getValue() != 0)
|
|
{
|
|
LocalObjectArrayRefPtr result(new LocalObjectArrayRef(static_cast<jobjectArray>(JavaLibrary::getEnv()->GetObjectField(object.getValue(), fieldID))));
|
|
if (result->getValue() != 0)
|
|
return result;
|
|
}
|
|
return LocalObjectArrayRef::cms_nullPtr;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
|
|
|
JavaStringPtr callStringMethod(const LocalRefParam & object, jmethodID methodID, ...)
|
|
{
|
|
if (object.getValue() != 0)
|
|
{
|
|
va_list marker;
|
|
va_start(marker, methodID);
|
|
|
|
jobject result = JavaLibrary::getEnv()->CallObjectMethodV(object.getValue(), methodID, marker);
|
|
|
|
va_end(marker);
|
|
|
|
if (result != 0)
|
|
{
|
|
#ifdef _DEBUG
|
|
if (!JavaLibrary::getEnv()->IsInstanceOf(result, JavaLibrary::ms_clsString))
|
|
{
|
|
WARNING_STRICT_FATAL(true, ("JavaLibrary::callStringMethod called with non-string result"));
|
|
JavaLibrary::getEnv()->DeleteLocalRef(result);
|
|
return JavaString::cms_nullPtr;
|
|
}
|
|
#endif
|
|
return JavaStringPtr(new JavaString(static_cast<jstring>(result)));
|
|
}
|
|
}
|
|
return JavaString::cms_nullPtr;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
|
|
|
JavaStringPtr callStaticStringMethod(jclass clazz, jmethodID methodID, ...)
|
|
{
|
|
va_list marker;
|
|
va_start(marker, methodID);
|
|
|
|
JavaStringPtr result(new JavaString(static_cast<jstring>(JavaLibrary::getEnv()->CallStaticObjectMethodV(clazz,
|
|
methodID, marker))));
|
|
|
|
va_end(marker);
|
|
|
|
if (result->getValue() != 0)
|
|
return result;
|
|
return JavaString::cms_nullPtr;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
|
|
|
JavaStringPtr getStringArrayElement(const LocalObjectArrayRefParam & array, int index)
|
|
{
|
|
if (array.getValue() != 0 && index >= 0)
|
|
{
|
|
JavaStringPtr result(new JavaString(static_cast<jstring>(JavaLibrary::getEnv()->GetObjectArrayElement(array.getValue(),
|
|
static_cast<jsize>(index)))));
|
|
if (result->getValue() != 0)
|
|
return result;
|
|
}
|
|
return JavaString::cms_nullPtr;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
|
|
|
LocalArrayRefPtr getArrayArrayElement(const LocalObjectArrayRefParam & array, int index)
|
|
{
|
|
if (array.getValue() != 0 && index >= 0)
|
|
{
|
|
LocalArrayRefPtr result(new LocalArrayRef(static_cast<jarray>(JavaLibrary::getEnv()->GetObjectArrayElement(array.getValue(),
|
|
static_cast<jsize>(index)))));
|
|
if (result->getValue() != 0)
|
|
return result;
|
|
}
|
|
return LocalArrayRef::cms_nullPtr;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
|
|
|
LocalObjectArrayRefPtr getObjectArrayArrayElement(const LocalObjectArrayRefParam & array, int index)
|
|
{
|
|
if (array.getValue() != 0 && index >= 0)
|
|
{
|
|
LocalObjectArrayRefPtr result(new LocalObjectArrayRef(static_cast<jobjectArray>(JavaLibrary::getEnv()->GetObjectArrayElement(array.getValue(),
|
|
static_cast<jsize>(index)))));
|
|
if (result->getValue() != 0)
|
|
return result;
|
|
}
|
|
return LocalObjectArrayRef::cms_nullPtr;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
|
|
|
LocalIntArrayRefPtr getIntArrayArrayElement(const LocalObjectArrayRefParam & array, int index)
|
|
{
|
|
if (array.getValue() != 0 && index >= 0)
|
|
{
|
|
LocalIntArrayRefPtr result(new LocalIntArrayRef(static_cast<jintArray>(JavaLibrary::getEnv()->GetObjectArrayElement(array.getValue(),
|
|
static_cast<jsize>(index)))));
|
|
if (result->getValue() != 0)
|
|
return result;
|
|
}
|
|
return LocalIntArrayRef::cms_nullPtr;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
|
|
|
LocalFloatArrayRefPtr getFloatArrayArrayElement(const LocalObjectArrayRefParam & array, int index)
|
|
{
|
|
if (array.getValue() != 0 && index >= 0)
|
|
{
|
|
LocalFloatArrayRefPtr result(new LocalFloatArrayRef(static_cast<jfloatArray>(JavaLibrary::getEnv()->GetObjectArrayElement(array.getValue(),
|
|
static_cast<jsize>(index)))));
|
|
if (result->getValue() != 0)
|
|
return result;
|
|
}
|
|
return LocalFloatArrayRef::cms_nullPtr;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
|
|
|
JavaStringPtr getStringField(const LocalRefParam & object, jfieldID fieldID)
|
|
{
|
|
if (object.getValue() != 0)
|
|
{
|
|
JavaStringPtr result(new JavaString(static_cast<jstring>(JavaLibrary::getEnv()->GetObjectField(object.getValue(), fieldID))));
|
|
if (result->getValue() != 0)
|
|
return result;
|
|
}
|
|
return JavaString::cms_nullPtr;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
|
|
|
void setObjectArrayElement(const LocalObjectArrayRefParam & array, jsize index, const LocalRefParam & value)
|
|
{
|
|
if (array.getValue() != 0 && index >= 0)
|
|
{
|
|
#ifdef _DEBUG
|
|
if (index >= JavaLibrary::getEnv()->GetArrayLength(array.getValue()))
|
|
{
|
|
WARNING(true, ("JavaLibrary::setObjectArrayElement array index %d "
|
|
"out of bounds", static_cast<int>(index)));
|
|
return;
|
|
}
|
|
#endif
|
|
JavaLibrary::getEnv()->SetObjectArrayElement(array.getValue(), index, value.getValue());
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
|
|
|
void setObjectField(const LocalRefParam & object, jfieldID fieldID, const LocalRefParam & value)
|
|
{
|
|
if (object.getValue() != 0)
|
|
{
|
|
JavaLibrary::getEnv()->SetObjectField(object.getValue(), fieldID, value.getValue());
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
|
|
|
jint getIntField(const LocalRefParam & object, jfieldID fieldID)
|
|
{
|
|
if (object.getValue() != 0)
|
|
{
|
|
return JavaLibrary::getEnv()->GetIntField(object.getValue(), fieldID);
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
|
|
|
jfloat getFloatField(const LocalRefParam & object, jfieldID fieldID)
|
|
{
|
|
if (object.getValue() != 0)
|
|
{
|
|
return JavaLibrary::getEnv()->GetFloatField(object.getValue(), fieldID);
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
|
|
|
jboolean getBooleanField(const LocalRefParam & object, jfieldID fieldID)
|
|
{
|
|
if (object.getValue() != 0)
|
|
{
|
|
return JavaLibrary::getEnv()->GetBooleanField(object.getValue(), fieldID);
|
|
}
|
|
return false;
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
|
|
|
void setIntField(const LocalRefParam & object, jfieldID fieldID, jint value)
|
|
{
|
|
if (object.getValue() != 0)
|
|
{
|
|
JavaLibrary::getEnv()->SetIntField(object.getValue(), fieldID, value);
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
|
|
|
void setFloatField(const LocalRefParam & object, jfieldID fieldID, jfloat value)
|
|
{
|
|
if (object.getValue() != 0)
|
|
{
|
|
JavaLibrary::getEnv()->SetFloatField(object.getValue(), fieldID, value);
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
|
|
|
void setBooleanField(const LocalRefParam & object, jfieldID fieldID, jboolean value)
|
|
{
|
|
if (object.getValue() != 0)
|
|
{
|
|
JavaLibrary::getEnv()->SetBooleanField(object.getValue(), fieldID, value);
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
|
|
|
void getByteArrayRegion(const LocalByteArrayRef & array, jsize start, jsize length, jbyte * buf)
|
|
{
|
|
if (array.getValue() != 0)
|
|
{
|
|
JavaLibrary::getEnv()->GetByteArrayRegion(array.getValue(), start, length, buf);
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
|
|
|
void getIntArrayRegion(const LocalIntArrayRef & array, jsize start, jsize length, jint * buf)
|
|
{
|
|
if (array.getValue() != 0)
|
|
{
|
|
JavaLibrary::getEnv()->GetIntArrayRegion(array.getValue(), start, length, buf);
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
|
|
|
void getFloatArrayRegion(const LocalFloatArrayRef & array, jsize start, jsize length, jfloat * buf)
|
|
{
|
|
if (array.getValue() != 0)
|
|
{
|
|
JavaLibrary::getEnv()->GetFloatArrayRegion(array.getValue(), start, length, buf);
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
|
|
|
void getBooleanArrayRegion(const LocalBooleanArrayRef & array, jsize start, jsize length, jboolean * buf)
|
|
{
|
|
if (array.getValue() != 0)
|
|
{
|
|
JavaLibrary::getEnv()->GetBooleanArrayRegion(array.getValue(), start, length, buf);
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
|
|
|
void getLongArrayRegion(const LocalLongArrayRef & array, jsize start, jsize length, jlong * buf)
|
|
{
|
|
if (array.getValue() != 0)
|
|
{
|
|
JavaLibrary::getEnv()->GetLongArrayRegion(array.getValue(), start, length, buf);
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
|
|
|
void setByteArrayRegion(const LocalByteArrayRef & array, jsize start, jsize length, jbyte * buf)
|
|
{
|
|
if (array.getValue() != 0)
|
|
{
|
|
JavaLibrary::getEnv()->SetByteArrayRegion(array.getValue(), start, length, buf);
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
|
|
|
void setIntArrayRegion(const LocalIntArrayRef & array, jsize start, jsize length, jint * buf)
|
|
{
|
|
if (array.getValue() != 0)
|
|
{
|
|
JavaLibrary::getEnv()->SetIntArrayRegion(array.getValue(), start, length, buf);
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
|
|
|
void setFloatArrayRegion(const LocalFloatArrayRef & array, jsize start, jsize length, jfloat * buf)
|
|
{
|
|
if (array.getValue() != 0)
|
|
{
|
|
JavaLibrary::getEnv()->SetFloatArrayRegion(array.getValue(), start, length, buf);
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
|
|
|
void setBooleanArrayRegion(const LocalBooleanArrayRef & array, jsize start, jsize length, jboolean * buf)
|
|
{
|
|
if (array.getValue() != 0)
|
|
{
|
|
JavaLibrary::getEnv()->SetBooleanArrayRegion(array.getValue(), start, length, buf);
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
|
|
|
void setLongArrayRegion(const LocalLongArrayRef & array, jsize start, jsize length, jlong * buf)
|
|
{
|
|
if (array.getValue() != 0)
|
|
{
|
|
JavaLibrary::getEnv()->SetLongArrayRegion(array.getValue(), start, length, buf);
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
|
|
|
/**
|
|
* Converts a Java array of strings to a vector of const char *. NOTE: The caller is
|
|
* responsible for freeing the returned strings.
|
|
*/
|
|
void getStringArray(const LocalObjectArrayRefParam & array, std::vector<const char *> & strings)
|
|
{
|
|
jsize count = getArrayLength(array);
|
|
strings.resize(count, 0);
|
|
|
|
jstring stringElement;
|
|
jsize stringLength;
|
|
jsize bufferLength;
|
|
char * newString;
|
|
|
|
JNIEnv * env = JavaLibrary::getEnv();
|
|
jobjectArray arrayRef = array.getValue();
|
|
std::vector<const char *>::iterator stringsIter = strings.begin();
|
|
for (jsize i = 0; i < count; ++i, ++stringsIter)
|
|
{
|
|
if (*stringsIter != 0)
|
|
delete[] const_cast<char *>(*stringsIter);
|
|
|
|
newString = 0;
|
|
stringElement = static_cast<jstring>(env->GetObjectArrayElement(arrayRef, i));
|
|
if (stringElement != 0)
|
|
{
|
|
stringLength = env->GetStringLength(stringElement);
|
|
bufferLength = env->GetStringUTFLength(stringElement);
|
|
newString = new char[bufferLength+1];
|
|
newString[bufferLength] = 0;
|
|
env->GetStringUTFRegion(stringElement, 0, stringLength, newString);
|
|
env->DeleteLocalRef(stringElement);
|
|
}
|
|
*stringsIter = newString;
|
|
}
|
|
}
|
|
|
|
//-----------------------------------------------------------------------
|
|
|
|
/**
|
|
* Converts a Java array of strings to a vector of const Unicode::String *. NOTE:
|
|
* The caller is responsible for freeing the returned strings.
|
|
*/
|
|
void getStringArray(const LocalObjectArrayRefParam & array, std::vector<const Unicode::String *> & strings)
|
|
{
|
|
jsize count = getArrayLength(array);
|
|
strings.resize(count, 0);
|
|
|
|
jsize stringLength;
|
|
jstring stringElement;
|
|
const jchar * newString;
|
|
|
|
JNIEnv * env = JavaLibrary::getEnv();
|
|
jobjectArray arrayRef = array.getValue();
|
|
std::vector<const Unicode::String *>::iterator stringsIter = strings.begin();
|
|
for (jsize i = 0; i < count; ++i, ++stringsIter)
|
|
{
|
|
delete *stringsIter;
|
|
|
|
stringElement = static_cast<jstring>(env->GetObjectArrayElement(arrayRef, i));
|
|
if (stringElement != 0)
|
|
{
|
|
stringLength = env->GetStringLength(stringElement);
|
|
newString = env->GetStringCritical(stringElement, 0);
|
|
*stringsIter = new Unicode::String(newString, stringLength);
|
|
env->ReleaseStringCritical(stringElement, newString);
|
|
env->DeleteLocalRef(stringElement);
|
|
}
|
|
else
|
|
*stringsIter = 0;
|
|
}
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------------------------
|
|
|
|
} // namespace JNIWrappersNamespace
|
|
|
|
|
|
//========================================================================
|
|
|
|
LocalRefParam::LocalRefParam(jobject src) :
|
|
m_ref(src)
|
|
{
|
|
}
|
|
|
|
LocalRefParam::~LocalRefParam()
|
|
{
|
|
}
|
|
|
|
jobject LocalRefParam::getReturnValue(void)
|
|
{
|
|
jobject return_val = m_ref;
|
|
m_ref = 0;
|
|
return return_val;
|
|
}
|
|
|
|
/**
|
|
* Only call this function if you really know what you're doing! Memory leaks
|
|
* may result!
|
|
*/
|
|
void LocalRefParam::emergencyClear()
|
|
{
|
|
m_ref = 0;
|
|
}
|
|
|
|
|
|
//========================================================================
|
|
|
|
LocalArrayRefParam::LocalArrayRefParam(jarray src) :
|
|
LocalRefParam(src)
|
|
{
|
|
}
|
|
|
|
LocalArrayRefParam::~LocalArrayRefParam()
|
|
{
|
|
}
|
|
|
|
|
|
//========================================================================
|
|
|
|
LocalObjectArrayRefParam::LocalObjectArrayRefParam(jobjectArray src) :
|
|
LocalArrayRefParam(src)
|
|
{
|
|
}
|
|
|
|
LocalObjectArrayRefParam::~LocalObjectArrayRefParam()
|
|
{
|
|
}
|
|
|
|
|
|
//========================================================================
|
|
|
|
LocalRef::LocalRef(jobject src) :
|
|
LocalRefParam(src)
|
|
{
|
|
}
|
|
|
|
LocalRef::~LocalRef()
|
|
{
|
|
if (m_ref != 0 && JavaLibrary::getEnv() != NULL)
|
|
JavaLibrary::getEnv()->DeleteLocalRef(m_ref);
|
|
m_ref = 0;
|
|
}
|
|
|
|
|
|
//========================================================================
|
|
|
|
LocalArrayRef::LocalArrayRef(jarray src) :
|
|
LocalArrayRefParam(src)
|
|
{
|
|
}
|
|
|
|
LocalArrayRef::~LocalArrayRef()
|
|
{
|
|
if (m_ref != 0 && JavaLibrary::getEnv() != NULL)
|
|
JavaLibrary::getEnv()->DeleteLocalRef(m_ref);
|
|
m_ref = 0;
|
|
}
|
|
|
|
|
|
//========================================================================
|
|
|
|
LocalObjectArrayRef::LocalObjectArrayRef(jobjectArray src) :
|
|
LocalObjectArrayRefParam(src)
|
|
{
|
|
}
|
|
|
|
LocalObjectArrayRef::~LocalObjectArrayRef()
|
|
{
|
|
if (m_ref != 0 && JavaLibrary::getEnv() != NULL)
|
|
JavaLibrary::getEnv()->DeleteLocalRef(m_ref);
|
|
m_ref = 0;
|
|
}
|
|
|
|
|
|
//========================================================================
|
|
|
|
LocalByteArrayRef::LocalByteArrayRef(jbyteArray src) :
|
|
LocalArrayRef(src)
|
|
{
|
|
}
|
|
|
|
LocalByteArrayRef::~LocalByteArrayRef()
|
|
{
|
|
}
|
|
|
|
|
|
//========================================================================
|
|
|
|
LocalIntArrayRef::LocalIntArrayRef(jintArray src) :
|
|
LocalArrayRef(src)
|
|
{
|
|
}
|
|
|
|
LocalIntArrayRef::~LocalIntArrayRef()
|
|
{
|
|
}
|
|
|
|
//========================================================================
|
|
|
|
LocalFloatArrayRef::LocalFloatArrayRef(jfloatArray src) :
|
|
LocalArrayRef(src)
|
|
{
|
|
}
|
|
|
|
LocalFloatArrayRef::~LocalFloatArrayRef()
|
|
{
|
|
}
|
|
|
|
|
|
//========================================================================
|
|
|
|
LocalBooleanArrayRef::LocalBooleanArrayRef(jbooleanArray src) :
|
|
LocalArrayRef(src)
|
|
{
|
|
}
|
|
|
|
LocalBooleanArrayRef::~LocalBooleanArrayRef()
|
|
{
|
|
}
|
|
|
|
|
|
//========================================================================
|
|
|
|
LocalLongArrayRef::LocalLongArrayRef(jlongArray src) :
|
|
LocalArrayRef(src)
|
|
{
|
|
}
|
|
|
|
LocalLongArrayRef::~LocalLongArrayRef()
|
|
{
|
|
}
|
|
|
|
|
|
//========================================================================
|
|
|
|
GlobalRef::GlobalRef(const LocalRefParam & src) :
|
|
LocalRefParam(static_cast<jobject>(0))
|
|
{
|
|
if (src.getValue() != 0 && JavaLibrary::getEnv() != NULL)
|
|
m_ref = JavaLibrary::getEnv()->NewGlobalRef(src.getValue());
|
|
}
|
|
|
|
GlobalRef::~GlobalRef()
|
|
{
|
|
if (m_ref != 0 && JavaLibrary::getEnv() != NULL)
|
|
JavaLibrary::getEnv()->DeleteGlobalRef(m_ref);
|
|
m_ref = 0;
|
|
}
|
|
|
|
|
|
//========================================================================
|
|
|
|
GlobalArrayRef::GlobalArrayRef(const LocalObjectArrayRefParam & src) :
|
|
LocalObjectArrayRefParam(static_cast<jobjectArray>(0))
|
|
{
|
|
if (src.getValue() != 0 && JavaLibrary::getEnv() != NULL)
|
|
m_ref = JavaLibrary::getEnv()->NewGlobalRef(src.getValue());
|
|
}
|
|
|
|
GlobalArrayRef::~GlobalArrayRef()
|
|
{
|
|
if (m_ref != 0 && JavaLibrary::getEnv() != NULL)
|
|
JavaLibrary::getEnv()->DeleteGlobalRef(m_ref);
|
|
m_ref = 0;
|
|
}
|
|
|
|
//========================================================================
|
|
|
|
JavaStringParam::JavaStringParam(jstring src) :
|
|
LocalRefParam(src)
|
|
{
|
|
}
|
|
|
|
JavaStringParam::JavaStringParam(const LocalRefParam & src) :
|
|
LocalRefParam(src.getValue())
|
|
{
|
|
}
|
|
|
|
JavaStringParam::~JavaStringParam()
|
|
{
|
|
}
|
|
|
|
int JavaStringParam::fillBuffer(char * buffer, int size) const
|
|
{
|
|
if (m_ref != 0 && buffer != NULL && JavaLibrary::getEnv() != NULL)
|
|
{
|
|
// Get the number of storage bytes required to convert this Java string into a UTF-8 string.
|
|
// Include the terminating null byte in the required buffer size.
|
|
int requiredBufferSize = JavaLibrary::getEnv()->GetStringUTFLength(static_cast<jstring>(m_ref)) + 1;
|
|
if (requiredBufferSize <= size)
|
|
{
|
|
int stringLength = JavaLibrary::getEnv()->GetStringLength(static_cast<jstring>(m_ref));
|
|
|
|
JavaLibrary::getEnv()->GetStringUTFRegion(static_cast<jstring>(m_ref), 0, stringLength, buffer);
|
|
|
|
// Null terminate the string. requiredBufferSize already includes the byte count for the null terminator.
|
|
buffer[requiredBufferSize - 1] = '\0';
|
|
|
|
return requiredBufferSize;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
|
|
//========================================================================
|
|
|
|
JavaString::JavaString(jstring src) :
|
|
JavaStringParam(src)
|
|
{
|
|
}
|
|
|
|
JavaString::JavaString(const char * src) :
|
|
JavaStringParam(JavaLibrary::getEnv()->NewStringUTF(src != NULL ? src : ""))
|
|
{
|
|
}
|
|
|
|
JavaString::JavaString(const std::string & src) :
|
|
JavaStringParam(JavaLibrary::getEnv()->NewStringUTF(src.c_str()))
|
|
{
|
|
}
|
|
|
|
JavaString::JavaString(const Unicode::String & src) :
|
|
JavaStringParam(JavaLibrary::getEnv()->NewString(src.data(), src.size()))
|
|
{
|
|
}
|
|
|
|
JavaString::~JavaString()
|
|
{
|
|
if (m_ref != 0 && JavaLibrary::getEnv() != NULL)
|
|
JavaLibrary::getEnv()->DeleteLocalRef(m_ref);
|
|
m_ref = 0;
|
|
}
|
|
|
|
|
|
//========================================================================
|
|
|
|
JavaDictionary::JavaDictionary(jobject src) :
|
|
LocalRef(src)
|
|
{
|
|
}
|
|
|
|
JavaDictionary::~JavaDictionary()
|
|
{
|
|
}
|
|
|
|
/**
|
|
* Converts the data in a JavaDictionary to a string.
|
|
*/
|
|
void JavaDictionary::serialize(void)
|
|
{
|
|
JavaLibrary::convert(*this, m_serializedData);
|
|
if (!m_serializedData.empty())
|
|
m_crc = Crc::calculate(&m_serializedData[0], m_serializedData.size());
|
|
else
|
|
m_crc = 0;
|
|
}
|
|
|