src/java.base/share/native/libjava/jni_util.c
branchdatagramsocketimpl-branch
changeset 58678 9cf78a70fa4f
parent 50527 83fd54252ee4
child 58679 9c3209ff7550
equal deleted inserted replaced
58677:13588c901957 58678:9cf78a70fa4f
    75 {
    75 {
    76     JNU_ThrowByName(env, "java/lang/IllegalArgumentException", msg);
    76     JNU_ThrowByName(env, "java/lang/IllegalArgumentException", msg);
    77 }
    77 }
    78 
    78 
    79 JNIEXPORT void JNICALL
    79 JNIEXPORT void JNICALL
    80 JNU_ThrowIllegalAccessError(JNIEnv *env, const char *msg)
       
    81 {
       
    82     JNU_ThrowByName(env, "java/lang/IllegalAccessError", msg);
       
    83 }
       
    84 
       
    85 JNIEXPORT void JNICALL
       
    86 JNU_ThrowIllegalAccessException(JNIEnv *env, const char *msg)
       
    87 {
       
    88     JNU_ThrowByName(env, "java/lang/IllegalAccessException", msg);
       
    89 }
       
    90 
       
    91 JNIEXPORT void JNICALL
       
    92 JNU_ThrowInternalError(JNIEnv *env, const char *msg)
    80 JNU_ThrowInternalError(JNIEnv *env, const char *msg)
    93 {
    81 {
    94     JNU_ThrowByName(env, "java/lang/InternalError", msg);
    82     JNU_ThrowByName(env, "java/lang/InternalError", msg);
    95 }
       
    96 
       
    97 JNIEXPORT void JNICALL
       
    98 JNU_ThrowNoSuchFieldException(JNIEnv *env, const char *msg)
       
    99 {
       
   100     JNU_ThrowByName(env, "java/lang/NoSuchFieldException", msg);
       
   101 }
       
   102 
       
   103 JNIEXPORT void JNICALL
       
   104 JNU_ThrowNoSuchMethodException(JNIEnv *env, const char *msg)
       
   105 {
       
   106     JNU_ThrowByName(env, "java/lang/NoSuchMethodException", msg);
       
   107 }
    83 }
   108 
    84 
   109 JNIEXPORT void JNICALL
    85 JNIEXPORT void JNICALL
   110 JNU_ThrowClassNotFoundException(JNIEnv *env, const char *msg)
    86 JNU_ThrowClassNotFoundException(JNIEnv *env, const char *msg)
   111 {
    87 {
   112     JNU_ThrowByName(env, "java/lang/ClassNotFoundException", msg);
    88     JNU_ThrowByName(env, "java/lang/ClassNotFoundException", msg);
   113 }
    89 }
   114 
    90 
   115 JNIEXPORT void JNICALL
    91 JNIEXPORT void JNICALL
   116 JNU_ThrowNumberFormatException(JNIEnv *env, const char *msg)
       
   117 {
       
   118     JNU_ThrowByName(env, "java/lang/NumberFormatException", msg);
       
   119 }
       
   120 
       
   121 JNIEXPORT void JNICALL
       
   122 JNU_ThrowIOException(JNIEnv *env, const char *msg)
    92 JNU_ThrowIOException(JNIEnv *env, const char *msg)
   123 {
    93 {
   124     JNU_ThrowByName(env, "java/io/IOException", msg);
    94     JNU_ThrowByName(env, "java/io/IOException", msg);
   125 }
       
   126 
       
   127 JNIEXPORT void JNICALL
       
   128 JNU_ThrowNoSuchFieldError(JNIEnv *env, const char *msg)
       
   129 {
       
   130     JNU_ThrowByName(env, "java/lang/NoSuchFieldError", msg);
       
   131 }
       
   132 
       
   133 JNIEXPORT void JNICALL
       
   134 JNU_ThrowNoSuchMethodError(JNIEnv *env, const char *msg)
       
   135 {
       
   136     JNU_ThrowByName(env, "java/lang/NoSuchMethodError", msg);
       
   137 }
       
   138 
       
   139 JNIEXPORT void JNICALL
       
   140 JNU_ThrowStringIndexOutOfBoundsException(JNIEnv *env, const char *msg)
       
   141 {
       
   142     JNU_ThrowByName(env, "java/lang/StringIndexOutOfBoundsException", msg);
       
   143 }
       
   144 
       
   145 JNIEXPORT void JNICALL
       
   146 JNU_ThrowInstantiationException(JNIEnv *env, const char *msg)
       
   147 {
       
   148     JNU_ThrowByName(env, "java/lang/InstantiationException", msg);
       
   149 }
    95 }
   150 
    96 
   151 /*
    97 /*
   152  * Throw an exception by name, using the string returned by
    98  * Throw an exception by name, using the string returned by
   153  * getLastErrorString for the detail string. If the last-error
    99  * getLastErrorString for the detail string. If the last-error
   843     CHECK_NULL(String_coder_ID);
   789     CHECK_NULL(String_coder_ID);
   844     String_value_ID = (*env)->GetFieldID(env, strClazz, "value", "[B");
   790     String_value_ID = (*env)->GetFieldID(env, strClazz, "value", "[B");
   845     CHECK_NULL(String_value_ID);
   791     CHECK_NULL(String_value_ID);
   846 }
   792 }
   847 
   793 
   848 JNIEXPORT jstring
       
   849 NewStringPlatform(JNIEnv *env, const char *str)
       
   850 {
       
   851     return JNU_NewStringPlatform(env, str);
       
   852 }
       
   853 
       
   854 JNIEXPORT jstring JNICALL
   794 JNIEXPORT jstring JNICALL
   855 JNU_NewStringPlatform(JNIEnv *env, const char *str)
   795 JNU_NewStringPlatform(JNIEnv *env, const char *str)
   856 {
   796 {
   857     if (fastEncoding == FAST_UTF_8)
   797     if (fastEncoding == FAST_UTF_8)
   858         return newStringUTF8(env, str);
   798         return newStringUTF8(env, str);
  1022         (*env)->DeleteLocalRef(env, c);
   962         (*env)->DeleteLocalRef(env, c);
  1023     }
   963     }
  1024     return cls;
   964     return cls;
  1025 }
   965 }
  1026 
   966 
  1027 JNIEXPORT jclass JNICALL
       
  1028 JNU_ClassClass(JNIEnv *env)
       
  1029 {
       
  1030     static jclass cls = 0;
       
  1031     if (cls == 0) {
       
  1032         jclass c;
       
  1033         if ((*env)->EnsureLocalCapacity(env, 1) < 0)
       
  1034             return 0;
       
  1035         c = (*env)->FindClass(env, "java/lang/Class");
       
  1036         CHECK_NULL_RETURN(c, NULL);
       
  1037         cls = (*env)->NewGlobalRef(env, c);
       
  1038         (*env)->DeleteLocalRef(env, c);
       
  1039     }
       
  1040     return cls;
       
  1041 }
       
  1042 
       
  1043 JNIEXPORT jclass JNICALL
       
  1044 JNU_ClassObject(JNIEnv *env)
       
  1045 {
       
  1046     static jclass cls = 0;
       
  1047     if (cls == 0) {
       
  1048         jclass c;
       
  1049         if ((*env)->EnsureLocalCapacity(env, 1) < 0)
       
  1050             return 0;
       
  1051         c = (*env)->FindClass(env, "java/lang/Object");
       
  1052         CHECK_NULL_RETURN(c, NULL);
       
  1053         cls = (*env)->NewGlobalRef(env, c);
       
  1054         (*env)->DeleteLocalRef(env, c);
       
  1055     }
       
  1056     return cls;
       
  1057 }
       
  1058 
       
  1059 JNIEXPORT jclass JNICALL
       
  1060 JNU_ClassThrowable(JNIEnv *env)
       
  1061 {
       
  1062     static jclass cls = 0;
       
  1063     if (cls == 0) {
       
  1064         jclass c;
       
  1065         if ((*env)->EnsureLocalCapacity(env, 1) < 0)
       
  1066             return 0;
       
  1067         c = (*env)->FindClass(env, "java/lang/Throwable");
       
  1068         CHECK_NULL_RETURN(c, NULL);
       
  1069         cls = (*env)->NewGlobalRef(env, c);
       
  1070         (*env)->DeleteLocalRef(env, c);
       
  1071     }
       
  1072     return cls;
       
  1073 }
       
  1074 
       
  1075 JNIEXPORT jint JNICALL
   967 JNIEXPORT jint JNICALL
  1076 JNU_CopyObjectArray(JNIEnv *env, jobjectArray dst, jobjectArray src,
   968 JNU_CopyObjectArray(JNIEnv *env, jobjectArray dst, jobjectArray src,
  1077                          jint count)
   969                          jint count)
  1078 {
   970 {
  1079     int i;
   971     int i;
  1094     (*vm)->GetEnv(vm, &env, version);
   986     (*vm)->GetEnv(vm, &env, version);
  1095     return env;
   987     return env;
  1096 }
   988 }
  1097 
   989 
  1098 JNIEXPORT jint JNICALL
   990 JNIEXPORT jint JNICALL
  1099 JNU_IsInstanceOfByName(JNIEnv *env, jobject object, char* classname)
   991 JNU_IsInstanceOfByName(JNIEnv *env, jobject object, const char* classname)
  1100 {
   992 {
  1101     jclass cls;
   993     jclass cls;
  1102     if ((*env)->EnsureLocalCapacity(env, 1) < 0)
   994     if ((*env)->EnsureLocalCapacity(env, 1) < 0)
  1103         return JNI_ERR;
   995         return JNI_ERR;
  1104     cls = (*env)->FindClass(env, classname);
   996     cls = (*env)->FindClass(env, classname);
  1108         return result;
  1000         return result;
  1109     }
  1001     }
  1110     return JNI_ERR;
  1002     return JNI_ERR;
  1111 }
  1003 }
  1112 
  1004 
  1113 JNIEXPORT jboolean JNICALL
       
  1114 JNU_Equals(JNIEnv *env, jobject object1, jobject object2)
       
  1115 {
       
  1116     static jmethodID mid = NULL;
       
  1117     if (mid == NULL) {
       
  1118         jclass objClazz = JNU_ClassObject(env);
       
  1119         CHECK_NULL_RETURN(objClazz, JNI_FALSE);
       
  1120         mid = (*env)->GetMethodID(env, objClazz, "equals",
       
  1121                                   "(Ljava/lang/Object;)Z");
       
  1122         CHECK_NULL_RETURN(mid, JNI_FALSE);
       
  1123     }
       
  1124     return (*env)->CallBooleanMethod(env, object1, mid, object2);
       
  1125 }
       
  1126 
       
  1127 
       
  1128 /************************************************************************
       
  1129  * Thread calls
       
  1130  */
       
  1131 
       
  1132 static jmethodID Object_waitMID;
       
  1133 static jmethodID Object_notifyMID;
       
  1134 static jmethodID Object_notifyAllMID;
       
  1135 
       
  1136 JNIEXPORT void JNICALL
       
  1137 JNU_MonitorWait(JNIEnv *env, jobject object, jlong timeout)
       
  1138 {
       
  1139     if (object == NULL) {
       
  1140         JNU_ThrowNullPointerException(env, "JNU_MonitorWait argument");
       
  1141         return;
       
  1142     }
       
  1143     if (Object_waitMID == NULL) {
       
  1144         jclass cls = JNU_ClassObject(env);
       
  1145         if (cls == NULL) {
       
  1146             return;
       
  1147         }
       
  1148         Object_waitMID = (*env)->GetMethodID(env, cls, "wait", "(J)V");
       
  1149         if (Object_waitMID == NULL) {
       
  1150             return;
       
  1151         }
       
  1152     }
       
  1153     (*env)->CallVoidMethod(env, object, Object_waitMID, timeout);
       
  1154 }
       
  1155 
       
  1156 JNIEXPORT void JNICALL
       
  1157 JNU_Notify(JNIEnv *env, jobject object)
       
  1158 {
       
  1159     if (object == NULL) {
       
  1160         JNU_ThrowNullPointerException(env, "JNU_Notify argument");
       
  1161         return;
       
  1162     }
       
  1163     if (Object_notifyMID == NULL) {
       
  1164         jclass cls = JNU_ClassObject(env);
       
  1165         if (cls == NULL) {
       
  1166             return;
       
  1167         }
       
  1168         Object_notifyMID = (*env)->GetMethodID(env, cls, "notify", "()V");
       
  1169         if (Object_notifyMID == NULL) {
       
  1170             return;
       
  1171         }
       
  1172     }
       
  1173     (*env)->CallVoidMethod(env, object, Object_notifyMID);
       
  1174 }
       
  1175 
       
  1176 JNIEXPORT void JNICALL
       
  1177 JNU_NotifyAll(JNIEnv *env, jobject object)
       
  1178 {
       
  1179     if (object == NULL) {
       
  1180         JNU_ThrowNullPointerException(env, "JNU_NotifyAll argument");
       
  1181         return;
       
  1182     }
       
  1183     if (Object_notifyAllMID == NULL) {
       
  1184         jclass cls = JNU_ClassObject(env);
       
  1185         if (cls == NULL) {
       
  1186             return;
       
  1187         }
       
  1188         Object_notifyAllMID = (*env)->GetMethodID(env, cls,"notifyAll", "()V");
       
  1189         if (Object_notifyAllMID == NULL) {
       
  1190             return;
       
  1191         }
       
  1192     }
       
  1193     (*env)->CallVoidMethod(env, object, Object_notifyAllMID);
       
  1194 }
       
  1195 
       
  1196 
       
  1197 /************************************************************************
  1005 /************************************************************************
  1198  * Debugging utilities
  1006  * Debugging utilities
  1199  */
  1007  */
  1200 
       
  1201 JNIEXPORT void JNICALL
       
  1202 JNU_PrintString(JNIEnv *env, char *hdr, jstring string)
       
  1203 {
       
  1204     if (string == NULL) {
       
  1205         fprintf(stderr, "%s: is NULL\n", hdr);
       
  1206     } else {
       
  1207         const char *stringPtr = JNU_GetStringPlatformChars(env, string, 0);
       
  1208         if (stringPtr == 0)
       
  1209             return;
       
  1210         fprintf(stderr, "%s: %s\n", hdr, stringPtr);
       
  1211         JNU_ReleaseStringPlatformChars(env, string, stringPtr);
       
  1212     }
       
  1213 }
       
  1214 
       
  1215 JNIEXPORT void JNICALL
       
  1216 JNU_PrintClass(JNIEnv *env, char* hdr, jobject object)
       
  1217 {
       
  1218     if (object == NULL) {
       
  1219         fprintf(stderr, "%s: object is NULL\n", hdr);
       
  1220         return;
       
  1221     } else {
       
  1222         jclass cls = (*env)->GetObjectClass(env, object);
       
  1223         jstring clsName = JNU_ToString(env, cls);
       
  1224         if (clsName == NULL) {
       
  1225             JNU_PrintString(env, hdr, clsName);
       
  1226         }
       
  1227         (*env)->DeleteLocalRef(env, cls);
       
  1228         (*env)->DeleteLocalRef(env, clsName);
       
  1229     }
       
  1230 }
       
  1231 
  1008 
  1232 JNIEXPORT jstring JNICALL
  1009 JNIEXPORT jstring JNICALL
  1233 JNU_ToString(JNIEnv *env, jobject object)
  1010 JNU_ToString(JNIEnv *env, jobject object)
  1234 {
  1011 {
  1235     if (object == NULL) {
  1012     if (object == NULL) {
  1435     if (hasException) {
  1212     if (hasException) {
  1436         *hasException = (*env)->ExceptionCheck(env);
  1213         *hasException = (*env)->ExceptionCheck(env);
  1437     }
  1214     }
  1438     return result;
  1215     return result;
  1439 }
  1216 }
  1440 
       
  1441 JNIEXPORT void JNICALL
       
  1442 JNU_SetStaticFieldByName(JNIEnv *env,
       
  1443                          jboolean *hasException,
       
  1444                          const char *classname,
       
  1445                          const char *name,
       
  1446                          const char *signature,
       
  1447                          ...)
       
  1448 {
       
  1449     jclass cls;
       
  1450     jfieldID fid;
       
  1451     va_list args;
       
  1452 
       
  1453     if ((*env)->EnsureLocalCapacity(env, 3) < 0)
       
  1454         goto done2;
       
  1455 
       
  1456     cls = (*env)->FindClass(env, classname);
       
  1457     if (cls == 0)
       
  1458         goto done2;
       
  1459 
       
  1460     fid = (*env)->GetStaticFieldID(env, cls, name, signature);
       
  1461     if (fid == 0)
       
  1462         goto done1;
       
  1463 
       
  1464     va_start(args, signature);
       
  1465     switch (*signature) {
       
  1466     case '[':
       
  1467     case 'L':
       
  1468         (*env)->SetStaticObjectField(env, cls, fid, va_arg(args, jobject));
       
  1469         break;
       
  1470     case 'Z':
       
  1471         (*env)->SetStaticBooleanField(env, cls, fid, (jboolean)va_arg(args, int));
       
  1472         break;
       
  1473     case 'B':
       
  1474         (*env)->SetStaticByteField(env, cls, fid, (jbyte)va_arg(args, int));
       
  1475         break;
       
  1476     case 'C':
       
  1477         (*env)->SetStaticCharField(env, cls, fid, (jchar)va_arg(args, int));
       
  1478         break;
       
  1479     case 'S':
       
  1480         (*env)->SetStaticShortField(env, cls, fid, (jshort)va_arg(args, int));
       
  1481         break;
       
  1482     case 'I':
       
  1483         (*env)->SetStaticIntField(env, cls, fid, va_arg(args, jint));
       
  1484         break;
       
  1485     case 'J':
       
  1486         (*env)->SetStaticLongField(env, cls, fid, va_arg(args, jlong));
       
  1487         break;
       
  1488     case 'F':
       
  1489         (*env)->SetStaticFloatField(env, cls, fid, (jfloat)va_arg(args, jdouble));
       
  1490         break;
       
  1491     case 'D':
       
  1492         (*env)->SetStaticDoubleField(env, cls, fid, va_arg(args, jdouble));
       
  1493         break;
       
  1494 
       
  1495     default:
       
  1496         (*env)->FatalError(env, "JNU_SetStaticFieldByName: illegal signature");
       
  1497     }
       
  1498     va_end(args);
       
  1499 
       
  1500  done1:
       
  1501     (*env)->DeleteLocalRef(env, cls);
       
  1502  done2:
       
  1503     if (hasException) {
       
  1504         *hasException = (*env)->ExceptionCheck(env);
       
  1505     }
       
  1506 }