android_emoji_EmojiFactory.cpp revision b6ac9e50cf1263979dfbab0430fb0e26d32224cd
1b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project#include "SkTypes.h" 2b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project#include "SkImageDecoder.h" 3b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 463507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawa#define LOG_TAG "EmojiFactory_jni" 5b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project#include <utils/Log.h> 6b6ac9e50cf1263979dfbab0430fb0e26d32224cdYou Kim#include <ScopedUtfChars.h> 7b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 8b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project#include "EmojiFactory.h" 9b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project#include <nativehelper/JNIHelp.h> 10b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 11b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project#include <dlfcn.h> 12b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project// #include <pthread.h> 13b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 14b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Projectnamespace android { 15b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 16b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Projectclass EmojiFactoryCaller { 17b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project public: 1863507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawa EmojiFactoryCaller() {} 19b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project virtual ~EmojiFactoryCaller(); 2063507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawa bool Init(); 21b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project EmojiFactory *TryCallGetImplementation(const char* name); 22b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project EmojiFactory *TryCallGetAvailableImplementation(); 23b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project private: 24b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project void *m_handle; 25b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project EmojiFactory *(*m_get_implementation)(const char*); 26b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project EmojiFactory *(*m_get_available_implementation)(); 27b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project}; 28b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 2963507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawabool EmojiFactoryCaller::Init() { 3063507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawa const char* error_msg; 31b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project m_handle = dlopen("libemoji.so", RTLD_LAZY | RTLD_LOCAL); 3263507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawa 3363507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawa if (m_handle == NULL) { 3463507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawa error_msg = "Failed to load libemoji.so"; 3563507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawa goto FAIL; 36b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project } 37b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 38b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project m_get_implementation = 39b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project reinterpret_cast<EmojiFactory *(*)(const char*)>( 40b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project dlsym(m_handle, "GetImplementation")); 4163507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawa if (m_get_implementation == NULL) { 4263507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawa error_msg = "Failed to get symbol of GetImplementation"; 4363507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawa goto FAIL; 44b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project } 45b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 46b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project m_get_available_implementation = 47b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project reinterpret_cast<EmojiFactory *(*)()>( 48b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project dlsym(m_handle,"GetAvailableImplementation")); 4963507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawa if (m_get_available_implementation == NULL) { 5063507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawa error_msg = "Failed to get symbol of GetAvailableImplementation"; 5163507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawa goto FAIL; 5263507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawa } 5363507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawa 5463507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawa return true; 5563507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawa 5663507babb6798d65bf965de6ea4622b7ec65aa28Daisuke MiyakawaFAIL: 5763507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawa const char* error_str = dlerror(); 5863507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawa if (error_str == NULL) { 5963507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawa error_str = "unknown reason"; 6063507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawa } 6163507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawa 623762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("%s: %s", error_msg, error_str); 6363507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawa if (m_handle != NULL) { 64b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project dlclose(m_handle); 65b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project m_handle = NULL; 66b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project } 6763507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawa return false; 68b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project} 69b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 70b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source ProjectEmojiFactoryCaller::~EmojiFactoryCaller() { 71b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project if (m_handle) { 72b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project dlclose(m_handle); 73b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project } 74b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project} 75b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 76b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source ProjectEmojiFactory *EmojiFactoryCaller::TryCallGetImplementation( 77b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project const char* name) { 78b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project if (NULL == m_handle) { 79b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project return NULL; 80b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project } 81b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project return m_get_implementation(name); 82b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project} 83b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 84b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source ProjectEmojiFactory *EmojiFactoryCaller::TryCallGetAvailableImplementation() { 85b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project if (NULL == m_handle) { 86b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project return NULL; 87b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project } 88b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project return m_get_available_implementation(); 89b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project} 90b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 9163507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawastatic EmojiFactoryCaller* gCaller; 9263507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawastatic pthread_once_t g_once = PTHREAD_ONCE_INIT; 9363507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawastatic bool lib_emoji_factory_is_ready; 94b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 95b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Projectstatic jclass gBitmap_class; 96b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Projectstatic jmethodID gBitmap_constructorMethodID; 97b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 98b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Projectstatic jclass gEmojiFactory_class; 99b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Projectstatic jmethodID gEmojiFactory_constructorMethodID; 100b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 10163507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawastatic void InitializeCaller() { 10263507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawa gCaller = new EmojiFactoryCaller(); 10363507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawa lib_emoji_factory_is_ready = gCaller->Init(); 10463507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawa} 105b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 106b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Projectstatic jobject create_java_EmojiFactory( 107b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project JNIEnv* env, EmojiFactory* factory, jstring name) { 108cf6f7a0f006c0fcf59bb634cbe79f2a8500fd92aElliott Hughes jobject obj = env->NewObject(gEmojiFactory_class, gEmojiFactory_constructorMethodID, 109cf6f7a0f006c0fcf59bb634cbe79f2a8500fd92aElliott Hughes static_cast<jint>(reinterpret_cast<uintptr_t>(factory)), name); 110cf6f7a0f006c0fcf59bb634cbe79f2a8500fd92aElliott Hughes if (env->ExceptionCheck() != 0) { 1113762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("*** Uncaught exception returned from Java call!\n"); 112cf6f7a0f006c0fcf59bb634cbe79f2a8500fd92aElliott Hughes env->ExceptionDescribe(); 113b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project } 114b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project return obj; 115b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project} 116b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 117b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Projectstatic jobject android_emoji_EmojiFactory_newInstance( 118b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project JNIEnv* env, jobject clazz, jstring name) { 119b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project if (NULL == name) { 120b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project return NULL; 121b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project } 12263507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawa pthread_once(&g_once, InitializeCaller); 12363507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawa if (!lib_emoji_factory_is_ready) { 12463507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawa return NULL; 12563507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawa } 126b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 127b6ac9e50cf1263979dfbab0430fb0e26d32224cdYou Kim ScopedUtfChars nameUtf(env, name); 128b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 129b6ac9e50cf1263979dfbab0430fb0e26d32224cdYou Kim EmojiFactory *factory = gCaller->TryCallGetImplementation(nameUtf.c_str()); 13063507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawa // EmojiFactory *factory = EmojiFactory::GetImplementation(str.string()); 13163507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawa if (NULL == factory) { 13263507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawa return NULL; 13363507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawa } 134b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 135b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project return create_java_EmojiFactory(env, factory, name); 136b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project} 137b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 138b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Projectstatic jobject android_emoji_EmojiFactory_newAvailableInstance( 139b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project JNIEnv* env, jobject clazz) { 14063507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawa pthread_once(&g_once, InitializeCaller); 14163507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawa if (!lib_emoji_factory_is_ready) { 14263507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawa return NULL; 14363507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawa } 144b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 14563507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawa EmojiFactory *factory = gCaller->TryCallGetAvailableImplementation(); 14663507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawa // EmojiFactory *factory = EmojiFactory::GetAvailableImplementation(); 147b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project if (NULL == factory) { 148b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project return NULL; 149b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project } 150b6ac9e50cf1263979dfbab0430fb0e26d32224cdYou Kim 151b6ac9e50cf1263979dfbab0430fb0e26d32224cdYou Kim jstring jname = env->NewStringUTF(factory->Name()); 152b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project if (NULL == jname) { 153b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project return NULL; 154b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project } 155b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 156b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project return create_java_EmojiFactory(env, factory, jname); 157b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project} 158b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 159b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Projectstatic jobject android_emoji_EmojiFactory_getBitmapFromAndroidPua( 160b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project JNIEnv* env, jobject clazz, jint nativeEmojiFactory, jint pua) { 161b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project EmojiFactory *factory = reinterpret_cast<EmojiFactory *>(nativeEmojiFactory); 162b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 163b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project int size; 164b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project const char *bytes = factory->GetImageBinaryFromAndroidPua(pua, &size); 165b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project if (bytes == NULL) { 166b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project return NULL; 167b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project } 168b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 169b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project SkBitmap *bitmap = new SkBitmap; 170b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project if (!SkImageDecoder::DecodeMemory(bytes, size, bitmap)) { 1713762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("SkImageDecoder::DecodeMemory() failed."); 172b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project return NULL; 173b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project } 174b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 175cf6f7a0f006c0fcf59bb634cbe79f2a8500fd92aElliott Hughes jobject obj = env->NewObject(gBitmap_class, gBitmap_constructorMethodID, 176cf6f7a0f006c0fcf59bb634cbe79f2a8500fd92aElliott Hughes static_cast<jint>(reinterpret_cast<uintptr_t>(bitmap)), NULL, false, NULL, -1); 177cf6f7a0f006c0fcf59bb634cbe79f2a8500fd92aElliott Hughes if (env->ExceptionCheck() != 0) { 1783762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("*** Uncaught exception returned from Java call!\n"); 179cf6f7a0f006c0fcf59bb634cbe79f2a8500fd92aElliott Hughes env->ExceptionDescribe(); 180b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project } 181b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project return obj; 182b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project} 183b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 184b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Projectstatic void android_emoji_EmojiFactory_destructor( 185b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project JNIEnv* env, jobject obj, jint nativeEmojiFactory) { 186c81c43991c3522451dbea1743a33d8f7e5446979Daisuke Miyakawa /* 187c81c43991c3522451dbea1743a33d8f7e5446979Daisuke Miyakawa // Must not delete this object!! 188b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project EmojiFactory *factory = reinterpret_cast<EmojiFactory *>(nativeEmojiFactory); 189b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project delete factory; 190c81c43991c3522451dbea1743a33d8f7e5446979Daisuke Miyakawa */ 191b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project} 192b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 193b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Projectstatic jint android_emoji_EmojiFactory_getAndroidPuaFromVendorSpecificSjis( 194b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project JNIEnv* env, jobject obj, jint nativeEmojiFactory, jchar sjis) { 195b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project EmojiFactory *factory = reinterpret_cast<EmojiFactory *>(nativeEmojiFactory); 196b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project return factory->GetAndroidPuaFromVendorSpecificSjis(sjis); 197b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project} 198b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 199b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Projectstatic jint android_emoji_EmojiFactory_getVendorSpecificSjisFromAndroidPua( 200b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project JNIEnv* env, jobject obj, jint nativeEmojiFactory, jint pua) { 201b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project EmojiFactory *factory = reinterpret_cast<EmojiFactory *>(nativeEmojiFactory); 202b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project return factory->GetVendorSpecificSjisFromAndroidPua(pua); 203b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project} 204b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 205b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Projectstatic jint android_emoji_EmojiFactory_getAndroidPuaFromVendorSpecificPua( 206b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project JNIEnv* env, jobject obj, jint nativeEmojiFactory, jint vsu) { 207b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project EmojiFactory *factory = reinterpret_cast<EmojiFactory *>(nativeEmojiFactory); 208b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project return factory->GetAndroidPuaFromVendorSpecificPua(vsu); 209b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project} 210b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 211b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Projectstatic jint android_emoji_EmojiFactory_getVendorSpecificPuaFromAndroidPua( 212b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project JNIEnv* env, jobject obj, jint nativeEmojiFactory, jint pua) { 213b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project EmojiFactory *factory = reinterpret_cast<EmojiFactory *>(nativeEmojiFactory); 214b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project return factory->GetVendorSpecificPuaFromAndroidPua(pua); 215b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project} 216b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 217b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Projectstatic jint android_emoji_EmojiFactory_getMaximumVendorSpecificPua( 218b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project JNIEnv* env, jobject obj, jint nativeEmojiFactory) { 219b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project EmojiFactory *factory = reinterpret_cast<EmojiFactory *>(nativeEmojiFactory); 220b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project return factory->GetMaximumVendorSpecificPua(); 221b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project} 222b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 223b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Projectstatic jint android_emoji_EmojiFactory_getMinimumVendorSpecificPua( 224b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project JNIEnv* env, jobject obj, jint nativeEmojiFactory) { 225b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project EmojiFactory *factory = reinterpret_cast<EmojiFactory *>(nativeEmojiFactory); 226b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project return factory->GetMinimumVendorSpecificPua(); 227b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project} 228b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 229b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Projectstatic jint android_emoji_EmojiFactory_getMaximumAndroidPua( 230b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project JNIEnv* env, jobject obj, jint nativeEmojiFactory) { 231b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project EmojiFactory *factory = reinterpret_cast<EmojiFactory *>(nativeEmojiFactory); 232b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project return factory->GetMaximumAndroidPua(); 233b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project} 234b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 235b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Projectstatic jint android_emoji_EmojiFactory_getMinimumAndroidPua( 236b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project JNIEnv* env, jobject obj, jint nativeEmojiFactory) { 237b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project EmojiFactory *factory = reinterpret_cast<EmojiFactory *>(nativeEmojiFactory); 238b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project return factory->GetMinimumAndroidPua(); 239b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project} 240b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 241b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Projectstatic JNINativeMethod gMethods[] = { 242b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project { "newInstance", "(Ljava/lang/String;)Landroid/emoji/EmojiFactory;", 243b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project (void*)android_emoji_EmojiFactory_newInstance}, 244b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project { "newAvailableInstance", "()Landroid/emoji/EmojiFactory;", 245b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project (void*)android_emoji_EmojiFactory_newAvailableInstance}, 246b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project { "nativeDestructor", "(I)V", 247b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project (void*)android_emoji_EmojiFactory_destructor}, 248b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project { "nativeGetBitmapFromAndroidPua", "(II)Landroid/graphics/Bitmap;", 249b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project (void*)android_emoji_EmojiFactory_getBitmapFromAndroidPua}, 250b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project { "nativeGetAndroidPuaFromVendorSpecificSjis", "(IC)I", 251b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project (void*)android_emoji_EmojiFactory_getAndroidPuaFromVendorSpecificSjis}, 252b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project { "nativeGetVendorSpecificSjisFromAndroidPua", "(II)I", 253b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project (void*)android_emoji_EmojiFactory_getVendorSpecificSjisFromAndroidPua}, 254b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project { "nativeGetAndroidPuaFromVendorSpecificPua", "(II)I", 255b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project (void*)android_emoji_EmojiFactory_getAndroidPuaFromVendorSpecificPua}, 256b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project { "nativeGetVendorSpecificPuaFromAndroidPua", "(II)I", 257b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project (void*)android_emoji_EmojiFactory_getVendorSpecificPuaFromAndroidPua}, 258b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project { "nativeGetMaximumVendorSpecificPua", "(I)I", 259b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project (void*)android_emoji_EmojiFactory_getMaximumVendorSpecificPua}, 260b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project { "nativeGetMinimumVendorSpecificPua", "(I)I", 261b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project (void*)android_emoji_EmojiFactory_getMinimumVendorSpecificPua}, 262b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project { "nativeGetMaximumAndroidPua", "(I)I", 263b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project (void*)android_emoji_EmojiFactory_getMaximumAndroidPua}, 264b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project { "nativeGetMinimumAndroidPua", "(I)I", 265b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project (void*)android_emoji_EmojiFactory_getMinimumAndroidPua} 266b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project}; 267b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 268b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Projectstatic jclass make_globalref(JNIEnv* env, const char classname[]) 269b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project{ 270b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project jclass c = env->FindClass(classname); 271b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project SkASSERT(c); 272b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project return (jclass)env->NewGlobalRef(c); 273b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project} 274b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 275b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Projectstatic jfieldID getFieldIDCheck(JNIEnv* env, jclass clazz, 276b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project const char fieldname[], const char type[]) 277b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project{ 278b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project jfieldID id = env->GetFieldID(clazz, fieldname, type); 279b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project SkASSERT(id); 280b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project return id; 281b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project} 282b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 283b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Projectint register_android_emoji_EmojiFactory(JNIEnv* env) { 284b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project gBitmap_class = make_globalref(env, "android/graphics/Bitmap"); 285b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project gBitmap_constructorMethodID = env->GetMethodID(gBitmap_class, "<init>", 286e4ac2d6b5723c95e648c489b187ddde449452c13Patrick Dubroy "(I[BZ[BI)V"); 287b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project gEmojiFactory_class = make_globalref(env, "android/emoji/EmojiFactory"); 288b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project gEmojiFactory_constructorMethodID = env->GetMethodID( 289b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project gEmojiFactory_class, "<init>", "(ILjava/lang/String;)V"); 290b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project return jniRegisterNativeMethods(env, "android/emoji/EmojiFactory", 291b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project gMethods, NELEM(gMethods)); 292b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project} 293b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 294b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project} // namespace android 295