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