1 /* 2 * Copyright (C) 2008 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 /* 18 * UTF-8 and Unicode string manipulation functions, plus convenience 19 * functions for working with java/lang/String. 20 */ 21 #ifndef DALVIK_STRING_H_ 22 #define DALVIK_STRING_H_ 23 24 #include <string> 25 #include <vector> 26 27 /* 28 * (This is private to UtfString.c, but we cheat a bit and also use it 29 * for InlineNative.c. Not really worth creating a separate header.) 30 * 31 * We can avoid poking around in gDvm by hard-coding the expected values of 32 * the String field offsets. This will be annoying if String is in flux 33 * or the VM field layout is changing, so we use defines here to make it 34 * easy to switch back to the gDvm version. 35 * 36 * The values are checked for correctness during startup. 37 */ 38 //#define USE_GLOBAL_STRING_DEFS 39 #ifdef USE_GLOBAL_STRING_DEFS 40 # define STRING_FIELDOFF_VALUE gDvm.offJavaLangString_value 41 # define STRING_FIELDOFF_OFFSET gDvm.offJavaLangString_offset 42 # define STRING_FIELDOFF_COUNT gDvm.offJavaLangString_count 43 # define STRING_FIELDOFF_HASHCODE gDvm.offJavaLangString_hashCode 44 #else 45 # define STRING_FIELDOFF_VALUE 8 46 # define STRING_FIELDOFF_HASHCODE 12 47 # define STRING_FIELDOFF_OFFSET 16 48 # define STRING_FIELDOFF_COUNT 20 49 #endif 50 51 /* 52 * Hash function for modified UTF-8 strings. 53 */ 54 u4 dvmComputeUtf8Hash(const char* str); 55 56 /* 57 * Hash function for string objects. Ensures the hash code field is 58 * populated and returns its value. 59 */ 60 u4 dvmComputeStringHash(StringObject* strObj); 61 62 /* 63 * Create a java.lang.String[] from a vector of C++ strings. 64 * 65 * The caller must call dvmReleaseTrackedAlloc() on the returned array, 66 * but not on the individual elements. 67 * 68 * Returns NULL and throws an exception on failure. 69 */ 70 ArrayObject* dvmCreateStringArray(const std::vector<std::string>& strings); 71 72 /* 73 * Create a java/lang/String from a C string. 74 * 75 * The caller must call dvmReleaseTrackedAlloc() on the return value. 76 * 77 * Returns NULL and throws an exception on failure. 78 */ 79 StringObject* dvmCreateStringFromCstr(const char* utf8Str); 80 81 /* 82 * Create a java/lang/String from a C++ string. 83 * 84 * The caller must call dvmReleaseTrackedAlloc() on the return value. 85 * 86 * Returns NULL and throws an exception on failure. 87 */ 88 StringObject* dvmCreateStringFromCstr(const std::string& utf8Str); 89 90 /* 91 * Create a java/lang/String from a C string, given its UTF-16 length 92 * (number of UTF-16 code points). 93 * 94 * The caller must call dvmReleaseTrackedAlloc() on the return value. 95 * 96 * Returns NULL and throws an exception on failure. 97 */ 98 StringObject* dvmCreateStringFromCstrAndLength(const char* utf8Str, 99 u4 utf16Length); 100 101 /* 102 * Compute the number of characters in a "modified UTF-8" string. This will 103 * match the result from strlen() so long as there are no multi-byte chars. 104 */ 105 size_t dvmUtf8Len(const char* utf8Str); 106 107 /* 108 * Convert a UTF-8 string to UTF-16. "utf16Str" must have enough room 109 * to hold the output. 110 */ 111 void dvmConvertUtf8ToUtf16(u2* utf16Str, const char* utf8Str); 112 113 /* 114 * Create a java/lang/String from a Unicode string. 115 * 116 * The caller must call dvmReleaseTrackedAlloc() on the return value. 117 */ 118 StringObject* dvmCreateStringFromUnicode(const u2* unichars, int len); 119 120 /* 121 * Create a UTF-8 C string from a java/lang/String. Caller must free 122 * the result. 123 * 124 * Returns NULL if "jstr" is NULL. 125 */ 126 char* dvmCreateCstrFromString(const StringObject* jstr); 127 128 /* 129 * Create a UTF-8 C string from a region of a java/lang/String. (Used by 130 * the JNI GetStringUTFRegion call.) 131 */ 132 void dvmGetStringUtfRegion(const StringObject* jstr, 133 int start, int len, char* buf); 134 135 /* 136 * Compare two string objects. (This is a dvmHashTableLookup() callback.) 137 */ 138 int dvmHashcmpStrings(const void* vstrObj1, const void* vstrObj2); 139 140 #endif // DALVIK_STRING_H_ 141