Martin Platter
Christian Thalinger
- $Id: jni.c 2898 2005-07-04 20:40:55Z twisti $
+ $Id: jni.c 3095 2005-07-21 13:51:36Z motse $
*/
#include "native/include/java_lang_VMClass.h"
#include "native/include/java_lang_VMClassLoader.h"
+#if defined(ENABLE_JVMTI)
+# include "native/jvmti/jvmti.h"
+#endif
+
#if defined(USE_THREADS)
# if defined(NATIVE_THREADS)
# include "threads/native/threads.h"
/* XXX TWISTI hack: define it extern so they can be found in this file */
+
extern const struct JNIInvokeInterface JNI_JavaVMTable;
extern struct JNINativeInterface JNI_JNIEnvTable;
/* pointers to VM and the environment needed by GetJavaVM and GetEnv */
+
static JavaVM ptr_jvm = (JavaVM) &JNI_JavaVMTable;
-static void* ptr_env = (void*) &JNI_JNIEnvTable;
+void* ptr_env = (void*) &JNI_JNIEnvTable;
#define PTR_TO_ITEM(ptr) ((u8)(size_t)(ptr))
void DeleteLocalRef(JNIEnv *env, jobject localRef)
{
- log_text("JNI-Call: DeleteLocalRef: IMPLEMENT ME!");
STATS(jniinvokation();)
+ log_text("JNI-Call: DeleteLocalRef: IMPLEMENT ME!");
}
}
+/* String Operations **********************************************************/
+
/* NewString *******************************************************************
Create new java.lang.String object from an array of Unicode
java_lang_String *s;
java_chararray *a;
u4 i;
+
STATS(jniinvokation();)
s = (java_lang_String *) builtin_new(class_java_lang_String);
static jchar emptyStringJ[]={0,0};
-/******************* returns the length of a Java string ***************************/
+/* GetStringLength *************************************************************
+
+ Returns the length (the count of Unicode characters) of a Java
+ string.
+
+*******************************************************************************/
-jsize GetStringLength (JNIEnv *env, jstring str)
+jsize GetStringLength(JNIEnv *env, jstring str)
{
- return ((java_lang_String*) str)->count;
+ return ((java_lang_String *) str)->count;
}
/******************** convertes javastring to u2-array ****************************/
-u2 *javastring_tou2 (jstring so)
+u2 *javastring_tou2(jstring so)
{
- java_lang_String *s = (java_lang_String*) so;
- java_chararray *a;
- u4 i;
- u2 *stringbuffer;
+ java_lang_String *s;
+ java_chararray *a;
+ u2 *stringbuffer;
+ u4 i;
+
STATS(jniinvokation();)
- if (!s) return NULL;
+ s = (java_lang_String *) so;
+
+ if (!s)
+ return NULL;
a = s->value;
- if (!a) return NULL;
+
+ if (!a)
+ return NULL;
/* allocate memory */
- stringbuffer = MNEW( u2 , s->count + 1 );
+
+ stringbuffer = MNEW(u2, s->count + 1);
/* copy text */
- for (i=0; i<s->count; i++) stringbuffer[i] = a->data[s->offset+i];
+
+ for (i = 0; i < s->count; i++)
+ stringbuffer[i] = a->data[s->offset + i];
/* terminate string */
+
stringbuffer[i] = '\0';
return stringbuffer;
}
-/********* returns a pointer to an array of Unicode characters of the string *******/
-const jchar *GetStringChars (JNIEnv *env, jstring str, jboolean *isCopy)
+/* GetStringChars **************************************************************
+
+ Returns a pointer to the array of Unicode characters of the
+ string. This pointer is valid until ReleaseStringchars() is called.
+
+*******************************************************************************/
+
+const jchar *GetStringChars(JNIEnv *env, jstring str, jboolean *isCopy)
{
- jchar *jc=javastring_tou2(str);
+ jchar *jc;
+
STATS(jniinvokation();)
+ jc = javastring_tou2(str);
+
if (jc) {
- if (isCopy) *isCopy=JNI_TRUE;
+ if (isCopy)
+ *isCopy = JNI_TRUE;
+
return jc;
}
- if (isCopy) *isCopy=JNI_TRUE;
+
+ if (isCopy)
+ *isCopy = JNI_TRUE;
+
return emptyStringJ;
}
-/**************** native code no longer needs access to chars **********************/
-void ReleaseStringChars (JNIEnv *env, jstring str, const jchar *chars)
+/* ReleaseStringChars **********************************************************
+
+ Informs the VM that the native code no longer needs access to
+ chars. The chars argument is a pointer obtained from string using
+ GetStringChars().
+
+*******************************************************************************/
+
+void ReleaseStringChars(JNIEnv *env, jstring str, const jchar *chars)
{
STATS(jniinvokation();)
- if (chars==emptyStringJ) return;
- MFREE(((jchar*) chars),jchar,((java_lang_String*) str)->count+1);
+
+ if (chars == emptyStringJ)
+ return;
+
+ MFREE(((jchar *) chars), jchar, ((java_lang_String *) str)->count + 1);
}
}
-jboolean * GetBooleanArrayElements (JNIEnv *env, jbooleanArray array, jboolean *isCopy)
+/* Get<PrimitiveType>ArrayElements *********************************************
+
+ A family of functions that returns the body of the primitive array.
+
+*******************************************************************************/
+
+jboolean *GetBooleanArrayElements(JNIEnv *env, jbooleanArray array,
+ jboolean *isCopy)
{
STATS(jniinvokation();)
- if (isCopy) *isCopy = JNI_FALSE;
+
+ if (isCopy)
+ *isCopy = JNI_FALSE;
+
return array->data;
}
-jbyte * GetByteArrayElements (JNIEnv *env, jbyteArray array, jboolean *isCopy)
+jbyte *GetByteArrayElements(JNIEnv *env, jbyteArray array, jboolean *isCopy)
{
STATS(jniinvokation();)
- if (isCopy) *isCopy = JNI_FALSE;
+
+ if (isCopy)
+ *isCopy = JNI_FALSE;
+
return array->data;
}
-jchar * GetCharArrayElements (JNIEnv *env, jcharArray array, jboolean *isCopy)
+jchar *GetCharArrayElements(JNIEnv *env, jcharArray array, jboolean *isCopy)
{
STATS(jniinvokation();)
- if (isCopy) *isCopy = JNI_FALSE;
+
+ if (isCopy)
+ *isCopy = JNI_FALSE;
+
return array->data;
}
-jshort * GetShortArrayElements (JNIEnv *env, jshortArray array, jboolean *isCopy)
+jshort *GetShortArrayElements(JNIEnv *env, jshortArray array, jboolean *isCopy)
{
STATS(jniinvokation();)
- if (isCopy) *isCopy = JNI_FALSE;
+
+ if (isCopy)
+ *isCopy = JNI_FALSE;
+
return array->data;
}
-jint * GetIntArrayElements (JNIEnv *env, jintArray array, jboolean *isCopy)
+jint *GetIntArrayElements(JNIEnv *env, jintArray array, jboolean *isCopy)
{
STATS(jniinvokation();)
- if (isCopy) *isCopy = JNI_FALSE;
+
+ if (isCopy)
+ *isCopy = JNI_FALSE;
+
return array->data;
}
-jlong * GetLongArrayElements (JNIEnv *env, jlongArray array, jboolean *isCopy)
+jlong *GetLongArrayElements(JNIEnv *env, jlongArray array, jboolean *isCopy)
{
STATS(jniinvokation();)
- if (isCopy) *isCopy = JNI_FALSE;
+
+ if (isCopy)
+ *isCopy = JNI_FALSE;
+
return array->data;
}
-jfloat * GetFloatArrayElements (JNIEnv *env, jfloatArray array, jboolean *isCopy)
+jfloat *GetFloatArrayElements(JNIEnv *env, jfloatArray array, jboolean *isCopy)
{
STATS(jniinvokation();)
- if (isCopy) *isCopy = JNI_FALSE;
+
+ if (isCopy)
+ *isCopy = JNI_FALSE;
+
return array->data;
}
-jdouble * GetDoubleArrayElements (JNIEnv *env, jdoubleArray array, jboolean *isCopy)
+jdouble *GetDoubleArrayElements(JNIEnv *env, jdoubleArray array,
+ jboolean *isCopy)
{
STATS(jniinvokation();)
- if (isCopy) *isCopy = JNI_FALSE;
+
+ if (isCopy)
+ *isCopy = JNI_FALSE;
+
return array->data;
}
+/* Release<PrimitiveType>ArrayElements *****************************************
+
+ A family of functions that informs the VM that the native code no
+ longer needs access to elems. The elems argument is a pointer
+ derived from array using the corresponding
+ Get<PrimitiveType>ArrayElements() function. If necessary, this
+ function copies back all changes made to elems to the original
+ array.
-void ReleaseBooleanArrayElements (JNIEnv *env, jbooleanArray array, jboolean *elems, jint mode)
+*******************************************************************************/
+
+void ReleaseBooleanArrayElements(JNIEnv *env, jbooleanArray array,
+ jboolean *elems, jint mode)
{
STATS(jniinvokation();)
- /* empty */
+
+ if (elems != array->data) {
+ switch (mode) {
+ case JNI_COMMIT:
+ MCOPY(array->data, elems, jboolean, array->header.size);
+ break;
+ case 0:
+ MCOPY(array->data, elems, jboolean, array->header.size);
+ /* XXX TWISTI how should it be freed? */
+ break;
+ case JNI_ABORT:
+ /* XXX TWISTI how should it be freed? */
+ break;
+ }
+ }
}
-void ReleaseByteArrayElements (JNIEnv *env, jbyteArray array, jbyte *elems, jint mode)
+void ReleaseByteArrayElements(JNIEnv *env, jbyteArray array, jbyte *elems,
+ jint mode)
{
STATS(jniinvokation();)
- /* empty */
+
+ if (elems != array->data) {
+ switch (mode) {
+ case JNI_COMMIT:
+ MCOPY(array->data, elems, jboolean, array->header.size);
+ break;
+ case 0:
+ MCOPY(array->data, elems, jboolean, array->header.size);
+ /* XXX TWISTI how should it be freed? */
+ break;
+ case JNI_ABORT:
+ /* XXX TWISTI how should it be freed? */
+ break;
+ }
+ }
}
-void ReleaseCharArrayElements (JNIEnv *env, jcharArray array, jchar *elems, jint mode)
+void ReleaseCharArrayElements(JNIEnv *env, jcharArray array, jchar *elems,
+ jint mode)
{
- /* empty */
+ STATS(jniinvokation();)
+
+ if (elems != array->data) {
+ switch (mode) {
+ case JNI_COMMIT:
+ MCOPY(array->data, elems, jboolean, array->header.size);
+ break;
+ case 0:
+ MCOPY(array->data, elems, jboolean, array->header.size);
+ /* XXX TWISTI how should it be freed? */
+ break;
+ case JNI_ABORT:
+ /* XXX TWISTI how should it be freed? */
+ break;
+ }
+ }
}
-void ReleaseShortArrayElements (JNIEnv *env, jshortArray array, jshort *elems, jint mode)
+void ReleaseShortArrayElements(JNIEnv *env, jshortArray array, jshort *elems,
+ jint mode)
{
STATS(jniinvokation();)
- /* empty */
+
+ if (elems != array->data) {
+ switch (mode) {
+ case JNI_COMMIT:
+ MCOPY(array->data, elems, jboolean, array->header.size);
+ break;
+ case 0:
+ MCOPY(array->data, elems, jboolean, array->header.size);
+ /* XXX TWISTI how should it be freed? */
+ break;
+ case JNI_ABORT:
+ /* XXX TWISTI how should it be freed? */
+ break;
+ }
+ }
}
-void ReleaseIntArrayElements (JNIEnv *env, jintArray array, jint *elems, jint mode)
+void ReleaseIntArrayElements(JNIEnv *env, jintArray array, jint *elems,
+ jint mode)
{
STATS(jniinvokation();)
- /* empty */
+
+ if (elems != array->data) {
+ switch (mode) {
+ case JNI_COMMIT:
+ MCOPY(array->data, elems, jboolean, array->header.size);
+ break;
+ case 0:
+ MCOPY(array->data, elems, jboolean, array->header.size);
+ /* XXX TWISTI how should it be freed? */
+ break;
+ case JNI_ABORT:
+ /* XXX TWISTI how should it be freed? */
+ break;
+ }
+ }
}
-void ReleaseLongArrayElements (JNIEnv *env, jlongArray array, jlong *elems, jint mode)
+void ReleaseLongArrayElements(JNIEnv *env, jlongArray array, jlong *elems,
+ jint mode)
{
STATS(jniinvokation();)
- /* empty */
+
+ if (elems != array->data) {
+ switch (mode) {
+ case JNI_COMMIT:
+ MCOPY(array->data, elems, jboolean, array->header.size);
+ break;
+ case 0:
+ MCOPY(array->data, elems, jboolean, array->header.size);
+ /* XXX TWISTI how should it be freed? */
+ break;
+ case JNI_ABORT:
+ /* XXX TWISTI how should it be freed? */
+ break;
+ }
+ }
}
-void ReleaseFloatArrayElements (JNIEnv *env, jfloatArray array, jfloat *elems, jint mode)
+void ReleaseFloatArrayElements(JNIEnv *env, jfloatArray array, jfloat *elems,
+ jint mode)
{
STATS(jniinvokation();)
- /* empty */
+
+ if (elems != array->data) {
+ switch (mode) {
+ case JNI_COMMIT:
+ MCOPY(array->data, elems, jboolean, array->header.size);
+ break;
+ case 0:
+ MCOPY(array->data, elems, jboolean, array->header.size);
+ /* XXX TWISTI how should it be freed? */
+ break;
+ case JNI_ABORT:
+ /* XXX TWISTI how should it be freed? */
+ break;
+ }
+ }
}
-void ReleaseDoubleArrayElements (JNIEnv *env, jdoubleArray array, jdouble *elems, jint mode)
+void ReleaseDoubleArrayElements(JNIEnv *env, jdoubleArray array,
+ jdouble *elems, jint mode)
{
STATS(jniinvokation();)
- /* empty */
+
+ if (elems != array->data) {
+ switch (mode) {
+ case JNI_COMMIT:
+ MCOPY(array->data, elems, jboolean, array->header.size);
+ break;
+ case 0:
+ MCOPY(array->data, elems, jboolean, array->header.size);
+ /* XXX TWISTI how should it be freed? */
+ break;
+ case JNI_ABORT:
+ /* XXX TWISTI how should it be freed? */
+ break;
+ }
+ }
}
-void GetBooleanArrayRegion(JNIEnv* env, jbooleanArray array, jsize start, jsize len, jboolean *buf)
+/* Get<PrimitiveType>ArrayRegion **********************************************
+
+ A family of functions that copies a region of a primitive array
+ into a buffer.
+
+*******************************************************************************/
+
+void GetBooleanArrayRegion(JNIEnv *env, jbooleanArray array, jsize start,
+ jsize len, jboolean *buf)
{
STATS(jniinvokation();)
+
if (start < 0 || len < 0 || start + len > array->header.size)
- *exceptionptr = new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
+ *exceptionptr =
+ new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
else
- memcpy(buf, &array->data[start], len * sizeof(array->data[0]));
+ MCOPY(buf, &array->data[start], jboolean, len);
}
-void GetByteArrayRegion(JNIEnv* env, jbyteArray array, jsize start, jsize len, jbyte *buf)
+void GetByteArrayRegion(JNIEnv *env, jbyteArray array, jsize start, jsize len,
+ jbyte *buf)
{
STATS(jniinvokation();)
+
if (start < 0 || len < 0 || start + len > array->header.size)
- *exceptionptr = new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
+ *exceptionptr =
+ new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
else
- memcpy(buf, &array->data[start], len * sizeof(array->data[0]));
+ MCOPY(buf, &array->data[start], jbyte, len);
}
-void GetCharArrayRegion(JNIEnv* env, jcharArray array, jsize start, jsize len, jchar *buf)
+void GetCharArrayRegion(JNIEnv *env, jcharArray array, jsize start, jsize len,
+ jchar *buf)
{
STATS(jniinvokation();)
+
if (start < 0 || len < 0 || start + len > array->header.size)
- *exceptionptr = new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
+ *exceptionptr =
+ new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
else
- memcpy(buf, &array->data[start], len * sizeof(array->data[0]));
+ MCOPY(buf, &array->data[start], jchar, len);
}
-void GetShortArrayRegion(JNIEnv* env, jshortArray array, jsize start, jsize len, jshort *buf)
+void GetShortArrayRegion(JNIEnv *env, jshortArray array, jsize start,
+ jsize len, jshort *buf)
{
STATS(jniinvokation();)
+
if (start < 0 || len < 0 || start + len > array->header.size)
- *exceptionptr = new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
+ *exceptionptr =
+ new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
else
- memcpy(buf, &array->data[start], len * sizeof(array->data[0]));
+ MCOPY(buf, &array->data[start], jshort, len);
}
-void GetIntArrayRegion(JNIEnv* env, jintArray array, jsize start, jsize len, jint *buf)
+void GetIntArrayRegion(JNIEnv *env, jintArray array, jsize start, jsize len,
+ jint *buf)
{
STATS(jniinvokation();)
+
if (start < 0 || len < 0 || start + len > array->header.size)
- *exceptionptr = new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
+ *exceptionptr =
+ new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
else
- memcpy(buf, &array->data[start], len * sizeof(array->data[0]));
+ MCOPY(buf, &array->data[start], jint, len);
}
-void GetLongArrayRegion(JNIEnv* env, jlongArray array, jsize start, jsize len, jlong *buf)
+void GetLongArrayRegion(JNIEnv *env, jlongArray array, jsize start, jsize len,
+ jlong *buf)
{
STATS(jniinvokation();)
+
if (start < 0 || len < 0 || start + len > array->header.size)
- *exceptionptr = new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
+ *exceptionptr =
+ new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
else
- memcpy(buf, &array->data[start], len * sizeof(array->data[0]));
+ MCOPY(buf, &array->data[start], jlong, len);
}
-void GetFloatArrayRegion(JNIEnv* env, jfloatArray array, jsize start, jsize len, jfloat *buf)
+void GetFloatArrayRegion(JNIEnv *env, jfloatArray array, jsize start,
+ jsize len, jfloat *buf)
{
STATS(jniinvokation();)
+
if (start < 0 || len < 0 || start + len > array->header.size)
- *exceptionptr = new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
+ *exceptionptr =
+ new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
else
- memcpy(buf, &array->data[start], len * sizeof(array->data[0]));
+ MCOPY(buf, &array->data[start], jfloat, len);
}
-void GetDoubleArrayRegion(JNIEnv* env, jdoubleArray array, jsize start, jsize len, jdouble *buf)
+void GetDoubleArrayRegion(JNIEnv *env, jdoubleArray array, jsize start,
+ jsize len, jdouble *buf)
{
STATS(jniinvokation();)
+
if (start < 0 || len < 0 || start+len>array->header.size)
- *exceptionptr = new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
+ *exceptionptr =
+ new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
else
- memcpy(buf, &array->data[start], len * sizeof(array->data[0]));
+ MCOPY(buf, &array->data[start], jdouble, len);
}
-void SetBooleanArrayRegion(JNIEnv* env, jbooleanArray array, jsize start, jsize len, jboolean *buf)
+/* Set<PrimitiveType>ArrayRegion **********************************************
+
+ A family of functions that copies back a region of a primitive
+ array from a buffer.
+
+*******************************************************************************/
+
+void SetBooleanArrayRegion(JNIEnv *env, jbooleanArray array, jsize start,
+ jsize len, jboolean *buf)
{
STATS(jniinvokation();)
+
if (start < 0 || len < 0 || start + len > array->header.size)
- *exceptionptr = new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
+ *exceptionptr =
+ new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
else
- memcpy(&array->data[start], buf, len * sizeof(array->data[0]));
+ MCOPY(&array->data[start], buf, jboolean, len);
}
-void SetByteArrayRegion(JNIEnv* env, jbyteArray array, jsize start, jsize len, jbyte *buf)
+void SetByteArrayRegion(JNIEnv *env, jbyteArray array, jsize start, jsize len,
+ jbyte *buf)
{
STATS(jniinvokation();)
+
if (start < 0 || len < 0 || start + len > array->header.size)
- *exceptionptr = new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
+ *exceptionptr =
+ new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
else
- memcpy(&array->data[start], buf, len * sizeof(array->data[0]));
+ MCOPY(&array->data[start], buf, jbyte, len);
}
-void SetCharArrayRegion(JNIEnv* env, jcharArray array, jsize start, jsize len, jchar *buf)
+void SetCharArrayRegion(JNIEnv *env, jcharArray array, jsize start, jsize len,
+ jchar *buf)
{
STATS(jniinvokation();)
+
if (start < 0 || len < 0 || start + len > array->header.size)
- *exceptionptr = new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
+ *exceptionptr =
+ new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
else
- memcpy(&array->data[start], buf, len * sizeof(array->data[0]));
+ MCOPY(&array->data[start], buf, jchar, len);
}
-void SetShortArrayRegion(JNIEnv* env, jshortArray array, jsize start, jsize len, jshort *buf)
+void SetShortArrayRegion(JNIEnv *env, jshortArray array, jsize start,
+ jsize len, jshort *buf)
{
STATS(jniinvokation();)
+
if (start < 0 || len < 0 || start + len > array->header.size)
- *exceptionptr = new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
+ *exceptionptr =
+ new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
else
- memcpy(&array->data[start], buf, len * sizeof(array->data[0]));
+ MCOPY(&array->data[start], buf, jshort, len);
}
-void SetIntArrayRegion(JNIEnv* env, jintArray array, jsize start, jsize len, jint *buf)
+void SetIntArrayRegion(JNIEnv *env, jintArray array, jsize start, jsize len,
+ jint *buf)
{
STATS(jniinvokation();)
+
if (start < 0 || len < 0 || start + len > array->header.size)
- *exceptionptr = new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
+ *exceptionptr =
+ new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
else
- memcpy(&array->data[start], buf, len * sizeof(array->data[0]));
+ MCOPY(&array->data[start], buf, jint, len);
}
-void SetLongArrayRegion(JNIEnv* env, jlongArray array, jsize start, jsize len, jlong *buf)
+void SetLongArrayRegion(JNIEnv* env, jlongArray array, jsize start, jsize len,
+ jlong *buf)
{
STATS(jniinvokation();)
+
if (start < 0 || len < 0 || start + len > array->header.size)
- *exceptionptr = new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
+ *exceptionptr =
+ new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
else
- memcpy(&array->data[start], buf, len * sizeof(array->data[0]));
+ MCOPY(&array->data[start], buf, jlong, len);
}
-void SetFloatArrayRegion(JNIEnv* env, jfloatArray array, jsize start, jsize len, jfloat *buf)
+void SetFloatArrayRegion(JNIEnv *env, jfloatArray array, jsize start,
+ jsize len, jfloat *buf)
{
STATS(jniinvokation();)
+
if (start < 0 || len < 0 || start + len > array->header.size)
- *exceptionptr = new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
+ *exceptionptr =
+ new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
else
- memcpy(&array->data[start], buf, len * sizeof(array->data[0]));
+ MCOPY(&array->data[start], buf, jfloat, len);
}
-void SetDoubleArrayRegion(JNIEnv* env, jdoubleArray array, jsize start, jsize len, jdouble *buf)
+void SetDoubleArrayRegion(JNIEnv *env, jdoubleArray array, jsize start,
+ jsize len, jdouble *buf)
{
STATS(jniinvokation();)
+
if (start < 0 || len < 0 || start + len > array->header.size)
- *exceptionptr = new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
+ *exceptionptr =
+ new_exception(string_java_lang_ArrayIndexOutOfBoundsException);
else
- memcpy(&array->data[start], buf, len * sizeof(array->data[0]));
+ MCOPY(&array->data[start], buf, jdouble, len);
}
-jint RegisterNatives (JNIEnv* env, jclass clazz, const JNINativeMethod *methods, jint nMethods)
+/* Registering Native Methods *************************************************/
+
+/* RegisterNatives *************************************************************
+
+ Registers native methods with the class specified by the clazz
+ argument. The methods parameter specifies an array of
+ JNINativeMethod structures that contain the names, signatures, and
+ function pointers of the native methods. The nMethods parameter
+ specifies the number of native methods in the array.
+
+*******************************************************************************/
+
+jint RegisterNatives(JNIEnv *env, jclass clazz, const JNINativeMethod *methods,
+ jint nMethods)
{
STATS(jniinvokation();)
- log_text("JNI-Call: RegisterNatives");
+
+ log_text("JNI-Call: RegisterNatives: IMPLEMENT ME!!!");
+
return 0;
}
-jint UnregisterNatives (JNIEnv* env, jclass clazz)
+/* UnregisterNatives ***********************************************************
+
+ Unregisters native methods of a class. The class goes back to the
+ state before it was linked or registered with its native method
+ functions.
+
+ This function should not be used in normal native code. Instead, it
+ provides special programs a way to reload and relink native
+ libraries.
+
+*******************************************************************************/
+
+jint UnregisterNatives(JNIEnv *env, jclass clazz)
{
STATS(jniinvokation();)
- log_text("JNI-Call: UnregisterNatives");
+
+ /* XXX TWISTI hmm, maybe we should not support that (like kaffe) */
+
+ log_text("JNI-Call: UnregisterNatives: IMPLEMENT ME!!!");
+
return 0;
}
}
-/************** obtain direct pointer to array elements ***********************/
+/* GetPrimitiveArrayCritical ***************************************************
+
+ Obtain a direct pointer to array elements.
-void * GetPrimitiveArrayCritical (JNIEnv* env, jarray array, jboolean *isCopy)
+*******************************************************************************/
+
+void *GetPrimitiveArrayCritical(JNIEnv *env, jarray array, jboolean *isCopy)
{
- java_objectheader *s = (java_objectheader*) array;
- arraydescriptor *desc = s->vftbl->arraydesc;
+ java_objectheader *s;
+ arraydescriptor *desc;
STATS(jniinvokation();)
- if (!desc) return NULL;
+ s = (java_objectheader *) array;
+ desc = s->vftbl->arraydesc;
+
+ if (!desc)
+ return NULL;
+
+ if (isCopy)
+ *isCopy = JNI_FALSE;
+
+ /* TODO add to global refs */
- return ((u1*)s) + desc->dataoffset;
+ return ((u1 *) s) + desc->dataoffset;
}
-void ReleasePrimitiveArrayCritical (JNIEnv* env, jarray array, void *carray, jint mode)
+/* ReleasePrimitiveArrayCritical ***********************************************
+
+ No specific documentation.
+
+*******************************************************************************/
+
+void ReleasePrimitiveArrayCritical(JNIEnv *env, jarray array, void *carray,
+ jint mode)
{
STATS(jniinvokation();)
- log_text("JNI-Call: ReleasePrimitiveArrayCritical");
- /* empty */
+ log_text("JNI-Call: ReleasePrimitiveArrayCritical: IMPLEMENT ME!!!");
+
+ /* TODO remove from global refs */
}
-/**** returns a pointer to an array of Unicode characters of the string *******/
-const jchar * GetStringCritical (JNIEnv* env, jstring string, jboolean *isCopy)
+/* GetStringCritical ***********************************************************
+
+ The semantics of these two functions are similar to the existing
+ Get/ReleaseStringChars functions.
+
+*******************************************************************************/
+
+const jchar *GetStringCritical(JNIEnv *env, jstring string, jboolean *isCopy)
{
STATS(jniinvokation();)
- log_text("JNI-Call: GetStringCritical");
- return GetStringChars(env,string,isCopy);
+ return GetStringChars(env, string, isCopy);
}
-/*********** native code no longer needs access to chars **********************/
-void ReleaseStringCritical (JNIEnv* env, jstring string, const jchar *cstring)
+void ReleaseStringCritical(JNIEnv *env, jstring string, const jchar *cstring)
{
STATS(jniinvokation();)
- log_text("JNI-Call: ReleaseStringCritical");
- ReleaseStringChars(env,string,cstring);
+ ReleaseStringChars(env, string, cstring);
}
jobject newval = NewObject(env, intclass, newint, val);
if (newval != NULL) {
- CallObjectMethod(env,*global_ref_table, putmid,newval);
+ CallObjectMethod(env,*global_ref_table, putmid, gref, newval);
} else {
log_text("JNI-DeleteGlobalRef: unable to create new java.lang.Integer");
jint AttachCurrentThread(JavaVM *vm, void **env, void *thr_args)
{
STATS(jniinvokation();)
+
log_text("AttachCurrentThread called");
#if !defined(HAVE___THREAD)
{
STATS(jniinvokation();)
+#if defined(USE_THREADS) && defined(NATIVE_THREADS)
if (thread_getself() == NULL) {
*env = NULL;
+
return JNI_EDETACHED;
}
+#endif
- if ((version != JNI_VERSION_1_1) && (version != JNI_VERSION_1_2) &&
- (version != JNI_VERSION_1_4)) {
- *env = NULL;
- return JNI_EVERSION;
+ if ((version == JNI_VERSION_1_1) || (version == JNI_VERSION_1_2) ||
+ (version == JNI_VERSION_1_4)) {
+ *env = &ptr_env;
+
+ return JNI_OK;
}
- *env = &ptr_env;
+#if defined(ENABLE_JVMTI)
+ if (version == JVMTI_VERSION_1_0) {
+ *env = (void *) new_jvmtienv();
- return JNI_OK;
+ if (env != NULL)
+ return JNI_OK;
+ }
+#endif
+
+ *env = NULL;
+
+ return JNI_EVERSION;
}
+
jint AttachCurrentThreadAsDaemon(JavaVM *vm, void **par1, void *par2)
{
STATS(jniinvokation();)
DeleteGlobalRef(env, gref);
}
-void jni_init(){
+
+void jni_init(void)
+{
jmethodID mid;
initrunning = true;
- log_text("JNI-Init: initialize global_ref_table");
+
/* initalize global reference table */
ihmclass = FindClass(NULL, "java/util/IdentityHashMap");
jint JNI_CreateJavaVM(JavaVM **p_vm, JNIEnv **p_env, void *vm_args)
{
- *p_vm = (JavaVM *) &JNI_JavaVMTable;
- *p_env = (JNIEnv *) &JNI_JNIEnvTable;
+ const struct JNIInvokeInterface *vm;
+ struct JNINativeInterface *env;
+
+ vm = &JNI_JavaVMTable;
+ env = &JNI_JNIEnvTable;
+
+ *p_vm = (JavaVM *) vm;
+ *p_env = (JNIEnv *) env;
return 0;
}