Author: mturk Date: Wed Apr 15 19:31:43 2009 New Revision: 765320 URL: http://svn.apache.org/viewvc?rev=765320&view=rev Log: Add core classes initialization. This is used for creating primitive and object arrays
Modified: commons/sandbox/runtime/trunk/src/main/native/include/acr_clazz.h commons/sandbox/runtime/trunk/src/main/native/include/acr_types.h commons/sandbox/runtime/trunk/src/main/native/os/unix/main.c commons/sandbox/runtime/trunk/src/main/native/os/win32/main.c commons/sandbox/runtime/trunk/src/main/native/shared/clazz.c commons/sandbox/runtime/trunk/src/main/native/test/testcase.c commons/sandbox/runtime/trunk/src/test/org/apache/commons/runtime/TestPrivate.java Modified: commons/sandbox/runtime/trunk/src/main/native/include/acr_clazz.h URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/include/acr_clazz.h?rev=765320&r1=765319&r2=765320&view=diff ============================================================================== --- commons/sandbox/runtime/trunk/src/main/native/include/acr_clazz.h (original) +++ commons/sandbox/runtime/trunk/src/main/native/include/acr_clazz.h Wed Apr 15 19:31:43 2009 @@ -18,6 +18,7 @@ #define _ACR_CLAZZ_H #include "acr.h" +#include "acr_types.h" #ifdef __cplusplus extern "C" { @@ -45,6 +46,12 @@ ACR_DECLARE(jclass) ACR_AddClassToGlobalCache(JNIEnv *env, jobject lock, const char *name); +/** + * Get core class instance. + * @param clazz Class to get. See acr_cclass_e enum + */ +ACR_DECLARE(jclass) ACR_GetCoreClass(acr_cclass_e clazz); + #ifdef __cplusplus } Modified: commons/sandbox/runtime/trunk/src/main/native/include/acr_types.h URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/include/acr_types.h?rev=765320&r1=765319&r2=765320&view=diff ============================================================================== --- commons/sandbox/runtime/trunk/src/main/native/include/acr_types.h (original) +++ commons/sandbox/runtime/trunk/src/main/native/include/acr_types.h Wed Apr 15 19:31:43 2009 @@ -63,15 +63,22 @@ /* Standard Java classes */ typedef enum { - ACR_CC_OBJECT, - ACR_CC_STRING, - ACR_CC_ZARRAY, - ACR_CC_BARRAY, - ACR_CC_CARRAY, - ACR_CC_IARRAY, - ACR_CC_JARRAY, - ACR_CC_TARRAY, - ACR_CC_OARRAY, + ACR_CC_OBJECT, /* Ljava/lang/Object; - String */ + ACR_CC_STRING, /* Ljava/lang/String; - Object */ + ACR_CC_ZARRAY, /* [Z - boolean[] */ + ACR_CC_BARRAY, /* [B - byte[] */ + ACR_CC_CARRAY, /* [C - char[] */ + ACR_CC_IARRAY, /* [I - int[] */ + ACR_CC_JARRAY, /* [I - long[] */ + ACR_CC_TARRAY, /* [Ljava/lang/String; - String[] */ + ACR_CC_OARRAY, /* [Ljava/lang/Object; - Object[] */ + ACR_CC_ZZ_ARR, /* [[Z - boolean[] */ + ACR_CC_BB_ARR, /* [[B - byte[][] */ + ACR_CC_CC_ARR, /* [[C - char[][] */ + ACR_CC_II_ARR, /* [[I - int[][] */ + ACR_CC_JJ_ARR, /* [[I - long[][] */ + ACR_CC_TT_ARR, /* [[Ljava/lang/String; - String[][] */ + ACR_CC_OO_ARR, /* [[Ljava/lang/Object; - Object[][] */ ACR_CC_MAX } acr_cclass_e; Modified: commons/sandbox/runtime/trunk/src/main/native/os/unix/main.c URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/os/unix/main.c?rev=765320&r1=765319&r2=765320&view=diff ============================================================================== --- commons/sandbox/runtime/trunk/src/main/native/os/unix/main.c (original) +++ commons/sandbox/runtime/trunk/src/main/native/os/unix/main.c Wed Apr 15 19:31:43 2009 @@ -29,6 +29,7 @@ static JavaVM *acr_pvm = NULL; static pthread_key_t acr_thread_key; +extern int ACR_InitCoreClasses(JNIEnv *); extern int ACR_InitClazzCache(JNIEnv *); extern int ACR_DestroyClazzCache(JNIEnv *); @@ -68,6 +69,8 @@ } if ((env = ACR_GetJNIEnv()) == NULL) return JNI_ERR; + if (ACR_InitCoreClasses(env) != ACR_SUCCESS) + return JNI_ERR; if (ACR_InitClazzCache(env) != ACR_SUCCESS) return JNI_ERR; Modified: commons/sandbox/runtime/trunk/src/main/native/os/win32/main.c URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/os/win32/main.c?rev=765320&r1=765319&r2=765320&view=diff ============================================================================== --- commons/sandbox/runtime/trunk/src/main/native/os/win32/main.c (original) +++ commons/sandbox/runtime/trunk/src/main/native/os/win32/main.c Wed Apr 15 19:31:43 2009 @@ -38,6 +38,7 @@ LPOSVERSIONINFOEXA acr_osver = &osver; static JavaVM *acr_pvm = NULL; +extern int ACR_InitCoreClasses(JNIEnv *); extern int ACR_InitClazzCache(JNIEnv *); extern int ACR_DestroyClazzCache(JNIEnv *); @@ -313,6 +314,8 @@ } env = epp; + if (ACR_InitCoreClasses(env) != ACR_SUCCESS) + return JNI_ERR; if (ACR_InitClazzCache(env) != ACR_SUCCESS) return JNI_ERR; Modified: commons/sandbox/runtime/trunk/src/main/native/shared/clazz.c URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/shared/clazz.c?rev=765320&r1=765319&r2=765320&view=diff ============================================================================== --- commons/sandbox/runtime/trunk/src/main/native/shared/clazz.c (original) +++ commons/sandbox/runtime/trunk/src/main/native/shared/clazz.c Wed Apr 15 19:31:43 2009 @@ -28,6 +28,27 @@ #define CLAZZ_INI_SIZE 128 static acr_table_t *clazz_cache; +struct { + const char *name; + jclass clazz; +} core_classes[] = { + { "Ljava/lang/Object;", NULL }, + { "Ljava/lang/String;", NULL }, + { "[Z", NULL }, + { "[B", NULL }, + { "[C", NULL }, + { "[I", NULL }, + { "[J", NULL }, + { "[Ljava/lang/Object;", NULL }, + { "[Ljava/lang/String;", NULL }, + { "[[Z", NULL }, + { "[[B", NULL }, + { "[[C", NULL }, + { "[[I", NULL }, + { "[[J", NULL }, + { NULL, NULL } +}; + int ACR_InitClazzCache(JNIEnv *_E) { @@ -37,7 +58,28 @@ if (!clazz_cache) return ACR_EISNULL; - return ACR_SUCCESS; + return ACR_SUCCESS; +} + +int ACR_InitCoreClasses(JNIEnv *_E) +{ + int i = 0; + + if (core_classes[0].clazz) + return ACR_SUCCESS; + while (core_classes[i].name) { + jobject o = (jobject)(*_E)->FindClass(_E, core_classes[i].name); + if (o != NULL) { + core_classes[i].clazz = (jclass)(*_E)->NewGlobalRef(_E, o); + (*_E)->DeleteLocalRef(_E, o); + } + else { + return ACR_ESYMNOTFOUND; + } + i++; + } + + return ACR_SUCCESS; } int ACR_DestroyClazzCache(JNIEnv *_E) @@ -56,29 +98,39 @@ ACR_TableFree(_E, THROW_FMARK, clazz_cache); clazz_cache = NULL; - return ACR_SUCCESS; + return ACR_SUCCESS; } -ACR_DECLARE(jclass) ACR_AddClassToGlobalCache(JNIEnv *_E, +ACR_DECLARE(jclass) ACR_AddClassToGlobalCache(JNIEnv *_E, jobject m, const char *name) { jobject o; jclass c = NULL; + if (!name) + return NULL; o = (jobject)(*_E)->FindClass(_E, name); if (o != NULL) { c = (jclass)(*_E)->NewGlobalRef(_E, o); (*_E)->DeleteLocalRef(_E, o); if (m) - (*_E)->MonitorEnter(_E, m); + (*_E)->MonitorEnter(_E, m); ACR_TableAdd(_E, THROW_FMARK, clazz_cache, name, c, 0); if (m) - (*_E)->MonitorExit(_E, m); + (*_E)->MonitorExit(_E, m); } return c; } +ACR_DECLARE(jclass) ACR_GetCoreClass(acr_cclass_e clazz) +{ + if (clazz >= 0 && clazz < ACR_CC_MAX) + return core_classes[clazz].clazz; + else + return NULL; +} + #ifdef ACR_ENABLE_TEST /* Just for testing the cache table */ int acr_clazz_cache_size() Modified: commons/sandbox/runtime/trunk/src/main/native/test/testcase.c URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/main/native/test/testcase.c?rev=765320&r1=765319&r2=765320&view=diff ============================================================================== --- commons/sandbox/runtime/trunk/src/main/native/test/testcase.c (original) +++ commons/sandbox/runtime/trunk/src/main/native/test/testcase.c Wed Apr 15 19:31:43 2009 @@ -190,3 +190,8 @@ return rc; } +ACR_JNI_EXPORT_DECLARE(jobject, TestPrivate, test014)(ACR_JNISTDARGS, jint d) +{ + jclass c = ACR_GetCoreClass(d); + return (jobject)c; +} Modified: commons/sandbox/runtime/trunk/src/test/org/apache/commons/runtime/TestPrivate.java URL: http://svn.apache.org/viewvc/commons/sandbox/runtime/trunk/src/test/org/apache/commons/runtime/TestPrivate.java?rev=765320&r1=765319&r2=765320&view=diff ============================================================================== --- commons/sandbox/runtime/trunk/src/test/org/apache/commons/runtime/TestPrivate.java (original) +++ commons/sandbox/runtime/trunk/src/test/org/apache/commons/runtime/TestPrivate.java Wed Apr 15 19:31:43 2009 @@ -39,20 +39,21 @@ private char longChar[] = new char[32768]; private String longString; - private static native void test000(int err); - private static native void test001(String msg); - private static native void test002(int err); - private static native void test003(int d); - private static native int test004(int d); - private static native int test005(String msg); - private static native int test006(String msg); - private static native int test007(int d); - private static native int test008(String msg); - private static native int test009(String msg); - private static native int test010(String msg); - private static native int test011(String msg); - private static native int test012(int d); - private static native int test013(int d); + private static native void test000(int err); + private static native void test001(String msg); + private static native void test002(int err); + private static native void test003(int d); + private static native int test004(int d); + private static native int test005(String msg); + private static native int test006(String msg); + private static native int test007(int d); + private static native int test008(String msg); + private static native int test009(String msg); + private static native int test010(String msg); + private static native int test011(String msg); + private static native int test012(int d); + private static native int test013(int d); + private static native Class test014(int d); protected void setUp() @@ -203,5 +204,13 @@ assertEquals("Value", 0, i); } + public void testCCore() + throws Exception + { + // Shuold not be called as last + Class c = test014(1); + assertEquals("Name", "java.lang.String", c.getName()); + } + }