android_text_AndroidCharacter.cpp revision bb9a51768d2d9dddbe2394b99a00544a3d144fac
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* //device/libs/android_runtime/android_text_AndroidCharacter.cpp 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** Copyright 2006, The Android Open Source Project 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** Licensed under the Apache License, Version 2.0 (the "License"); 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** you may not use this file except in compliance with the License. 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** You may obtain a copy of the License at 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** http://www.apache.org/licenses/LICENSE-2.0 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** Unless required by applicable law or agreed to in writing, software 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** distributed under the License is distributed on an "AS IS" BASIS, 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** See the License for the specific language governing permissions and 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** limitations under the License. 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project*/ 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define LOG_TAG "AndroidUnicode" 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <jni.h> 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <android_runtime/AndroidRuntime.h> 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "utils/misc.h" 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "utils/Log.h" 24a9886c580b299984e62303a995bf7b13276b5bc8Kenny Root#include "unicode/uchar.h" 25a9886c580b299984e62303a995bf7b13276b5bc8Kenny Root 26bb9a51768d2d9dddbe2394b99a00544a3d144facKenny Root#define PROPERTY_UNDEFINED (-1) 27bb9a51768d2d9dddbe2394b99a00544a3d144facKenny Root 28a9886c580b299984e62303a995bf7b13276b5bc8Kenny Root// ICU => JDK mapping 29a9886c580b299984e62303a995bf7b13276b5bc8Kenny Rootstatic int directionality_map[U_CHAR_DIRECTION_COUNT] = { 30a9886c580b299984e62303a995bf7b13276b5bc8Kenny Root 0, // U_LEFT_TO_RIGHT (0) => DIRECTIONALITY_LEFT_TO_RIGHT (0) 31a9886c580b299984e62303a995bf7b13276b5bc8Kenny Root 1, // U_RIGHT_TO_LEFT (1) => DIRECTIONALITY_RIGHT_TO_LEFT (1) 32a9886c580b299984e62303a995bf7b13276b5bc8Kenny Root 3, // U_EUROPEAN_NUMBER (2) => DIRECTIONALITY_EUROPEAN_NUMBER (3) 33a9886c580b299984e62303a995bf7b13276b5bc8Kenny Root 4, // U_EUROPEAN_NUMBER_SEPARATOR (3) => DIRECTIONALITY_EUROPEAN_NUMBER_SEPARATOR (4) 34a9886c580b299984e62303a995bf7b13276b5bc8Kenny Root 5, // U_EUROPEAN_NUMBER_TERMINATOR (4) => DIRECTIONALITY_EUROPEAN_NUMBER_TERMINATOR (5) 35a9886c580b299984e62303a995bf7b13276b5bc8Kenny Root 6, // U_ARABIC_NUMBER (5) => DIRECTIONALITY_ARABIC_NUMBER (6) 36a9886c580b299984e62303a995bf7b13276b5bc8Kenny Root 7, // U_COMMON_NUMBER_SEPARATOR (6) => DIRECTIONALITY_COMMON_NUMBER_SEPARATOR (7) 37a9886c580b299984e62303a995bf7b13276b5bc8Kenny Root 10, // U_BLOCK_SEPARATOR (7) => DIRECTIONALITY_PARAGRAPH_SEPARATOR (10) 38a9886c580b299984e62303a995bf7b13276b5bc8Kenny Root 11, // U_SEGMENT_SEPARATOR (8) => DIRECTIONALITY_SEGMENT_SEPARATOR (11) 39a9886c580b299984e62303a995bf7b13276b5bc8Kenny Root 12, // U_WHITE_SPACE_NEUTRAL (9) => DIRECTIONALITY_WHITESPACE (12) 40a9886c580b299984e62303a995bf7b13276b5bc8Kenny Root 13, // U_OTHER_NEUTRAL (10) => DIRECTIONALITY_OTHER_NEUTRALS (13) 41a9886c580b299984e62303a995bf7b13276b5bc8Kenny Root 14, // U_LEFT_TO_RIGHT_EMBEDDING (11) => DIRECTIONALITY_LEFT_TO_RIGHT_EMBEDDING (14) 42a9886c580b299984e62303a995bf7b13276b5bc8Kenny Root 15, // U_LEFT_TO_RIGHT_OVERRIDE (12) => DIRECTIONALITY_LEFT_TO_RIGHT_OVERRIDE (15) 43a9886c580b299984e62303a995bf7b13276b5bc8Kenny Root 2, // U_RIGHT_TO_LEFT_ARABIC (13) => DIRECTIONALITY_RIGHT_TO_LEFT_ARABIC (2) 44a9886c580b299984e62303a995bf7b13276b5bc8Kenny Root 16, // U_RIGHT_TO_LEFT_EMBEDDING (14) => DIRECTIONALITY_RIGHT_TO_LEFT_EMBEDDING (16) 45a9886c580b299984e62303a995bf7b13276b5bc8Kenny Root 17, // U_RIGHT_TO_LEFT_OVERRIDE (15) => DIRECTIONALITY_RIGHT_TO_LEFT_OVERRIDE (17) 46a9886c580b299984e62303a995bf7b13276b5bc8Kenny Root 18, // U_POP_DIRECTIONAL_FORMAT (16) => DIRECTIONALITY_POP_DIRECTIONAL_FORMAT (18) 47a9886c580b299984e62303a995bf7b13276b5bc8Kenny Root 8, // U_DIR_NON_SPACING_MARK (17) => DIRECTIONALITY_NONSPACING_MARK (8) 48a9886c580b299984e62303a995bf7b13276b5bc8Kenny Root 9, // U_BOUNDARY_NEUTRAL (18) => DIRECTIONALITY_BOUNDARY_NEUTRAL (9) 49a9886c580b299984e62303a995bf7b13276b5bc8Kenny Root}; 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android { 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void jniThrowException(JNIEnv* env, const char* exc, const char* msg = NULL) 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jclass excClazz = env->FindClass(exc); 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOG_ASSERT(excClazz, "Unable to find class %s", exc); 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ThrowNew(excClazz, msg); 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void getDirectionalities(JNIEnv* env, jobject obj, jcharArray srcArray, jbyteArray destArray, int count) 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jchar* src = env->GetCharArrayElements(srcArray, NULL); 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jbyte* dest = env->GetByteArrayElements(destArray, NULL); 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (src == NULL || dest == NULL) { 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/NullPointerException", NULL); 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto DIRECTION_END; 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (env->GetArrayLength(srcArray) < count || env->GetArrayLength(destArray) < count) { 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/ArrayIndexOutOfBoundsException", NULL); 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto DIRECTION_END; 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < count; i++) { 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (src[i] >= 0xD800 && src[i] <= 0xDBFF && 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i + 1 < count && 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project src[i + 1] >= 0xDC00 && src[i + 1] <= 0xDFFF) { 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int c = 0x00010000 + ((src[i] - 0xD800) << 10) + 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (src[i + 1] & 0x3FF); 81a9886c580b299984e62303a995bf7b13276b5bc8Kenny Root int dir = u_charDirection(c); 82a9886c580b299984e62303a995bf7b13276b5bc8Kenny Root if (dir < 0 || dir >= U_CHAR_DIRECTION_COUNT) 83bb9a51768d2d9dddbe2394b99a00544a3d144facKenny Root dir = PROPERTY_UNDEFINED; 84a9886c580b299984e62303a995bf7b13276b5bc8Kenny Root else 85a9886c580b299984e62303a995bf7b13276b5bc8Kenny Root dir = directionality_map[dir]; 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest[i++] = dir; 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dest[i] = dir; 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int c = src[i]; 91a9886c580b299984e62303a995bf7b13276b5bc8Kenny Root int dir = u_charDirection(c); 92a9886c580b299984e62303a995bf7b13276b5bc8Kenny Root if (dir < 0 || dir >= U_CHAR_DIRECTION_COUNT) 93bb9a51768d2d9dddbe2394b99a00544a3d144facKenny Root dest[i] = PROPERTY_UNDEFINED; 94a9886c580b299984e62303a995bf7b13276b5bc8Kenny Root else 95a9886c580b299984e62303a995bf7b13276b5bc8Kenny Root dest[i] = directionality_map[dir]; 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectDIRECTION_END: 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseCharArrayElements(srcArray, src, JNI_ABORT); 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseByteArrayElements(destArray, dest, JNI_ABORT); 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 104bb9a51768d2d9dddbe2394b99a00544a3d144facKenny Rootstatic jint getEastAsianWidth(JNIEnv* env, jobject obj, jchar input) 105bb9a51768d2d9dddbe2394b99a00544a3d144facKenny Root{ 106bb9a51768d2d9dddbe2394b99a00544a3d144facKenny Root int width = u_getIntPropertyValue(input, UCHAR_EAST_ASIAN_WIDTH); 107bb9a51768d2d9dddbe2394b99a00544a3d144facKenny Root if (width < 0 || width >= U_EA_COUNT) 108bb9a51768d2d9dddbe2394b99a00544a3d144facKenny Root width = PROPERTY_UNDEFINED; 109bb9a51768d2d9dddbe2394b99a00544a3d144facKenny Root 110bb9a51768d2d9dddbe2394b99a00544a3d144facKenny Root return width; 111bb9a51768d2d9dddbe2394b99a00544a3d144facKenny Root} 112bb9a51768d2d9dddbe2394b99a00544a3d144facKenny Root 113bb9a51768d2d9dddbe2394b99a00544a3d144facKenny Rootstatic void getEastAsianWidths(JNIEnv* env, jobject obj, jcharArray srcArray, 114bb9a51768d2d9dddbe2394b99a00544a3d144facKenny Root int start, int count, jbyteArray destArray) 115bb9a51768d2d9dddbe2394b99a00544a3d144facKenny Root{ 116bb9a51768d2d9dddbe2394b99a00544a3d144facKenny Root jchar* src = env->GetCharArrayElements(srcArray, NULL); 117bb9a51768d2d9dddbe2394b99a00544a3d144facKenny Root jbyte* dest = env->GetByteArrayElements(destArray, NULL); 118bb9a51768d2d9dddbe2394b99a00544a3d144facKenny Root if (src == NULL || dest == NULL) { 119bb9a51768d2d9dddbe2394b99a00544a3d144facKenny Root jniThrowException(env, "java/lang/NullPointerException", NULL); 120bb9a51768d2d9dddbe2394b99a00544a3d144facKenny Root goto EA_END; 121bb9a51768d2d9dddbe2394b99a00544a3d144facKenny Root } 122bb9a51768d2d9dddbe2394b99a00544a3d144facKenny Root 123bb9a51768d2d9dddbe2394b99a00544a3d144facKenny Root if (start < 0 || start > start + count 124bb9a51768d2d9dddbe2394b99a00544a3d144facKenny Root || env->GetArrayLength(srcArray) < (start + count) 125bb9a51768d2d9dddbe2394b99a00544a3d144facKenny Root || env->GetArrayLength(destArray) < count) { 126bb9a51768d2d9dddbe2394b99a00544a3d144facKenny Root jniThrowException(env, "java/lang/ArrayIndexOutOfBoundsException", NULL); 127bb9a51768d2d9dddbe2394b99a00544a3d144facKenny Root goto EA_END; 128bb9a51768d2d9dddbe2394b99a00544a3d144facKenny Root } 129bb9a51768d2d9dddbe2394b99a00544a3d144facKenny Root 130bb9a51768d2d9dddbe2394b99a00544a3d144facKenny Root for (int i = 0; i < count; i++) { 131bb9a51768d2d9dddbe2394b99a00544a3d144facKenny Root const int srci = start + i; 132bb9a51768d2d9dddbe2394b99a00544a3d144facKenny Root if (src[srci] >= 0xD800 && src[srci] <= 0xDBFF && 133bb9a51768d2d9dddbe2394b99a00544a3d144facKenny Root i + 1 < count && 134bb9a51768d2d9dddbe2394b99a00544a3d144facKenny Root src[srci + 1] >= 0xDC00 && src[srci + 1] <= 0xDFFF) { 135bb9a51768d2d9dddbe2394b99a00544a3d144facKenny Root int c = 0x00010000 + ((src[srci] - 0xD800) << 10) + 136bb9a51768d2d9dddbe2394b99a00544a3d144facKenny Root (src[srci + 1] & 0x3FF); 137bb9a51768d2d9dddbe2394b99a00544a3d144facKenny Root int width = u_getIntPropertyValue(c, UCHAR_EAST_ASIAN_WIDTH); 138bb9a51768d2d9dddbe2394b99a00544a3d144facKenny Root if (width < 0 || width >= U_EA_COUNT) 139bb9a51768d2d9dddbe2394b99a00544a3d144facKenny Root width = PROPERTY_UNDEFINED; 140bb9a51768d2d9dddbe2394b99a00544a3d144facKenny Root 141bb9a51768d2d9dddbe2394b99a00544a3d144facKenny Root dest[i++] = width; 142bb9a51768d2d9dddbe2394b99a00544a3d144facKenny Root dest[i] = width; 143bb9a51768d2d9dddbe2394b99a00544a3d144facKenny Root } else { 144bb9a51768d2d9dddbe2394b99a00544a3d144facKenny Root int c = src[srci]; 145bb9a51768d2d9dddbe2394b99a00544a3d144facKenny Root int width = u_getIntPropertyValue(c, UCHAR_EAST_ASIAN_WIDTH); 146bb9a51768d2d9dddbe2394b99a00544a3d144facKenny Root if (width < 0 || width >= U_EA_COUNT) 147bb9a51768d2d9dddbe2394b99a00544a3d144facKenny Root width = PROPERTY_UNDEFINED; 148bb9a51768d2d9dddbe2394b99a00544a3d144facKenny Root 149bb9a51768d2d9dddbe2394b99a00544a3d144facKenny Root dest[i] = width; 150bb9a51768d2d9dddbe2394b99a00544a3d144facKenny Root } 151bb9a51768d2d9dddbe2394b99a00544a3d144facKenny Root } 152bb9a51768d2d9dddbe2394b99a00544a3d144facKenny Root 153bb9a51768d2d9dddbe2394b99a00544a3d144facKenny RootEA_END: 154bb9a51768d2d9dddbe2394b99a00544a3d144facKenny Root env->ReleaseCharArrayElements(srcArray, src, JNI_ABORT); 155bb9a51768d2d9dddbe2394b99a00544a3d144facKenny Root env->ReleaseByteArrayElements(destArray, dest, JNI_ABORT); 156bb9a51768d2d9dddbe2394b99a00544a3d144facKenny Root} 157bb9a51768d2d9dddbe2394b99a00544a3d144facKenny Root 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean mirror(JNIEnv* env, jobject obj, jcharArray charArray, int start, int count) 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jchar* data = env->GetCharArrayElements(charArray, NULL); 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool ret = false; 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (data == NULL) { 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/NullPointerException", NULL); 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto MIRROR_END; 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (start > start + count || env->GetArrayLength(charArray) < count) { 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/ArrayIndexOutOfBoundsException", NULL); 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto MIRROR_END; 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = start; i < start + count; i++) { 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // XXX this thinks it knows that surrogates are never mirrored 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int c1 = data[i]; 177a9886c580b299984e62303a995bf7b13276b5bc8Kenny Root int c2 = u_charMirror(c1); 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (c1 != c2) { 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project data[i] = c2; 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ret = true; 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectMIRROR_END: 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ReleaseCharArrayElements(charArray, data, JNI_ABORT); 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ret; 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jchar getMirror(JNIEnv* env, jobject obj, jchar c) 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 192a9886c580b299984e62303a995bf7b13276b5bc8Kenny Root return u_charMirror(c); 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNINativeMethod gMethods[] = { 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "getDirectionalities", "([C[BI)V", 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (void*) getDirectionalities }, 198bb9a51768d2d9dddbe2394b99a00544a3d144facKenny Root { "getEastAsianWidth", "(C)I", 199bb9a51768d2d9dddbe2394b99a00544a3d144facKenny Root (void*) getEastAsianWidth }, 200bb9a51768d2d9dddbe2394b99a00544a3d144facKenny Root { "getEastAsianWidths", "([CII[B)V", 201bb9a51768d2d9dddbe2394b99a00544a3d144facKenny Root (void*) getEastAsianWidths }, 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "mirror", "([CII)Z", 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (void*) mirror }, 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "getMirror", "(C)C", 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project (void*) getMirror } 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint register_android_text_AndroidCharacter(JNIEnv* env) 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jclass clazz = env->FindClass("android/text/AndroidCharacter"); 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOG_ASSERT(clazz, "Cannot find android/text/AndroidCharacter"); 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return AndroidRuntime::registerNativeMethods(env, "android/text/AndroidCharacter", 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gMethods, NELEM(gMethods)); 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 218