android_text_AndroidBidi.cpp revision f5df700e6ce056ebfa322314d970e52d6facc35a
1/* //device/libs/android_runtime/android_text_AndroidBidi.cpp 2** 3** Copyright 2010, The Android Open Source Project 4** 5** Licensed under the Apache License, Version 2.0 (the "License"); 6** you may not use this file except in compliance with the License. 7** You may obtain a copy of the License at 8** 9** http://www.apache.org/licenses/LICENSE-2.0 10** 11** Unless required by applicable law or agreed to in writing, software 12** distributed under the License is distributed on an "AS IS" BASIS, 13** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14** See the License for the specific language governing permissions and 15** limitations under the License. 16*/ 17 18#define LOG_TAG "AndroidUnicode" 19 20#include "JNIHelp.h" 21#include <android_runtime/AndroidRuntime.h> 22#include "utils/misc.h" 23#include "utils/Log.h" 24#include "unicode/ubidi.h" 25 26namespace android { 27 28static jint runBidi(JNIEnv* env, jobject obj, jint dir, jcharArray chsArray, 29 jbyteArray infoArray, jint n, jboolean haveInfo) 30{ 31 // Parameters are checked on java side 32 // Failures from GetXXXArrayElements indicate a serious out-of-memory condition 33 // that we don't bother to report, we're probably dead anyway. 34 jint result = 0; 35 jchar* chs = env->GetCharArrayElements(chsArray, NULL); 36 if (chs != NULL) { 37 jbyte* info = env->GetByteArrayElements(infoArray, NULL); 38 if (info != NULL) { 39 UErrorCode status = U_ZERO_ERROR; 40 UBiDi* bidi = ubidi_openSized(n, 0, &status); 41 ubidi_setPara(bidi, chs, n, dir, NULL, &status); 42 if (U_SUCCESS(status)) { 43 for (int i = 0; i < n; ++i) { 44 info[i] = ubidi_getLevelAt(bidi, i); 45 } 46 result = ubidi_getParaLevel(bidi); 47 } else { 48 jniThrowException(env, "java/lang/RuntimeException", NULL); 49 } 50 ubidi_close(bidi); 51 52 env->ReleaseByteArrayElements(infoArray, info, 0); 53 } 54 env->ReleaseCharArrayElements(chsArray, chs, JNI_ABORT); 55 } 56 return result; 57} 58 59static JNINativeMethod gMethods[] = { 60 { "runBidi", "(I[C[BIZ)I", 61 (void*) runBidi } 62}; 63 64int register_android_text_AndroidBidi(JNIEnv* env) 65{ 66 return AndroidRuntime::registerNativeMethods(env, "android/text/AndroidBidi", 67 gMethods, NELEM(gMethods)); 68} 69 70} 71