android_emoji_EmojiFactory.cpp revision 1abf5d62429e5a9329520b2f7c2b5a5e7a8e72ec
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" 91abf5d62429e5a9329520b2f7c2b5a5e7a8e72ecChris Craik#include "GraphicsJNI.h" 10b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project#include <nativehelper/JNIHelp.h> 11b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 12b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project#include <dlfcn.h> 13b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project// #include <pthread.h> 14b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 15b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Projectnamespace android { 16b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 17b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Projectclass EmojiFactoryCaller { 18b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project public: 1963507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawa EmojiFactoryCaller() {} 20b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project virtual ~EmojiFactoryCaller(); 2163507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawa bool Init(); 22b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project EmojiFactory *TryCallGetImplementation(const char* name); 23b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project EmojiFactory *TryCallGetAvailableImplementation(); 24b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project private: 25b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project void *m_handle; 26b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project EmojiFactory *(*m_get_implementation)(const char*); 27b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project EmojiFactory *(*m_get_available_implementation)(); 28b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project}; 29b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 3063507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawabool EmojiFactoryCaller::Init() { 3163507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawa const char* error_msg; 32b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project m_handle = dlopen("libemoji.so", RTLD_LAZY | RTLD_LOCAL); 3363507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawa 3463507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawa if (m_handle == NULL) { 3563507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawa error_msg = "Failed to load libemoji.so"; 3663507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawa goto FAIL; 37b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project } 38b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 39b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project m_get_implementation = 40b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project reinterpret_cast<EmojiFactory *(*)(const char*)>( 41b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project dlsym(m_handle, "GetImplementation")); 4263507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawa if (m_get_implementation == NULL) { 4363507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawa error_msg = "Failed to get symbol of GetImplementation"; 4463507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawa goto FAIL; 45b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project } 46b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 47b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project m_get_available_implementation = 48b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project reinterpret_cast<EmojiFactory *(*)()>( 49b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project dlsym(m_handle,"GetAvailableImplementation")); 5063507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawa if (m_get_available_implementation == NULL) { 5163507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawa error_msg = "Failed to get symbol of GetAvailableImplementation"; 5263507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawa goto FAIL; 5363507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawa } 5463507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawa 5563507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawa return true; 5663507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawa 5763507babb6798d65bf965de6ea4622b7ec65aa28Daisuke MiyakawaFAIL: 5863507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawa const char* error_str = dlerror(); 5963507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawa if (error_str == NULL) { 6063507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawa error_str = "unknown reason"; 6163507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawa } 6263507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawa 633762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("%s: %s", error_msg, error_str); 6463507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawa if (m_handle != NULL) { 65b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project dlclose(m_handle); 66b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project m_handle = NULL; 67b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project } 6863507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawa return false; 69b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project} 70b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 71b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source ProjectEmojiFactoryCaller::~EmojiFactoryCaller() { 72b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project if (m_handle) { 73b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project dlclose(m_handle); 74b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project } 75b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project} 76b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 77b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source ProjectEmojiFactory *EmojiFactoryCaller::TryCallGetImplementation( 78b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project const char* name) { 79b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project if (NULL == m_handle) { 80b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project return NULL; 81b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project } 82b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project return m_get_implementation(name); 83b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project} 84b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 85b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source ProjectEmojiFactory *EmojiFactoryCaller::TryCallGetAvailableImplementation() { 86b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project if (NULL == m_handle) { 87b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project return NULL; 88b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project } 89b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project return m_get_available_implementation(); 90b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project} 91b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 9263507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawastatic EmojiFactoryCaller* gCaller; 9363507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawastatic pthread_once_t g_once = PTHREAD_ONCE_INIT; 9463507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawastatic bool lib_emoji_factory_is_ready; 95b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 96b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Projectstatic jclass gEmojiFactory_class; 97b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Projectstatic jmethodID gEmojiFactory_constructorMethodID; 98b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 9963507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawastatic void InitializeCaller() { 10063507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawa gCaller = new EmojiFactoryCaller(); 10163507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawa lib_emoji_factory_is_ready = gCaller->Init(); 10263507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawa} 103b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 104b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Projectstatic jobject create_java_EmojiFactory( 105b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project JNIEnv* env, EmojiFactory* factory, jstring name) { 106cf6f7a0f006c0fcf59bb634cbe79f2a8500fd92aElliott Hughes jobject obj = env->NewObject(gEmojiFactory_class, gEmojiFactory_constructorMethodID, 107cf6f7a0f006c0fcf59bb634cbe79f2a8500fd92aElliott Hughes static_cast<jint>(reinterpret_cast<uintptr_t>(factory)), name); 108cf6f7a0f006c0fcf59bb634cbe79f2a8500fd92aElliott Hughes if (env->ExceptionCheck() != 0) { 1093762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("*** Uncaught exception returned from Java call!\n"); 110cf6f7a0f006c0fcf59bb634cbe79f2a8500fd92aElliott Hughes env->ExceptionDescribe(); 111b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project } 112b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project return obj; 113b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project} 114b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 115b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Projectstatic jobject android_emoji_EmojiFactory_newInstance( 116b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project JNIEnv* env, jobject clazz, jstring name) { 117b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project if (NULL == name) { 118b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project return NULL; 119b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project } 12063507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawa pthread_once(&g_once, InitializeCaller); 12163507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawa if (!lib_emoji_factory_is_ready) { 12263507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawa return NULL; 12363507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawa } 124b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 125b6ac9e50cf1263979dfbab0430fb0e26d32224cdYou Kim ScopedUtfChars nameUtf(env, name); 126b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 127b6ac9e50cf1263979dfbab0430fb0e26d32224cdYou Kim EmojiFactory *factory = gCaller->TryCallGetImplementation(nameUtf.c_str()); 12863507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawa // EmojiFactory *factory = EmojiFactory::GetImplementation(str.string()); 12963507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawa if (NULL == factory) { 13063507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawa return NULL; 13163507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawa } 132b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 133b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project return create_java_EmojiFactory(env, factory, name); 134b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project} 135b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 136b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Projectstatic jobject android_emoji_EmojiFactory_newAvailableInstance( 137b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project JNIEnv* env, jobject clazz) { 13863507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawa pthread_once(&g_once, InitializeCaller); 13963507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawa if (!lib_emoji_factory_is_ready) { 14063507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawa return NULL; 14163507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawa } 142b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 14363507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawa EmojiFactory *factory = gCaller->TryCallGetAvailableImplementation(); 14463507babb6798d65bf965de6ea4622b7ec65aa28Daisuke Miyakawa // EmojiFactory *factory = EmojiFactory::GetAvailableImplementation(); 145b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project if (NULL == factory) { 146b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project return NULL; 147b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project } 148b6ac9e50cf1263979dfbab0430fb0e26d32224cdYou Kim 149b6ac9e50cf1263979dfbab0430fb0e26d32224cdYou Kim jstring jname = env->NewStringUTF(factory->Name()); 150b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project if (NULL == jname) { 151b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project return NULL; 152b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project } 153b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 154b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project return create_java_EmojiFactory(env, factory, jname); 155b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project} 156b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 157b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Projectstatic jobject android_emoji_EmojiFactory_getBitmapFromAndroidPua( 158b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project JNIEnv* env, jobject clazz, jint nativeEmojiFactory, jint pua) { 159b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project EmojiFactory *factory = reinterpret_cast<EmojiFactory *>(nativeEmojiFactory); 160b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 161b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project int size; 162b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project const char *bytes = factory->GetImageBinaryFromAndroidPua(pua, &size); 163b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project if (bytes == NULL) { 164b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project return NULL; 165b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project } 166b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 167b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project SkBitmap *bitmap = new SkBitmap; 168b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project if (!SkImageDecoder::DecodeMemory(bytes, size, bitmap)) { 1693762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("SkImageDecoder::DecodeMemory() failed."); 170b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project return NULL; 171b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project } 172b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 1731abf5d62429e5a9329520b2f7c2b5a5e7a8e72ecChris Craik return GraphicsJNI::createBitmap(env, bitmap, 1741abf5d62429e5a9329520b2f7c2b5a5e7a8e72ecChris Craik GraphicsJNI::kBitmapCreateFlag_Premultiplied, NULL); 175b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project} 176b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 177b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Projectstatic void android_emoji_EmojiFactory_destructor( 178b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project JNIEnv* env, jobject obj, jint nativeEmojiFactory) { 179c81c43991c3522451dbea1743a33d8f7e5446979Daisuke Miyakawa /* 180c81c43991c3522451dbea1743a33d8f7e5446979Daisuke Miyakawa // Must not delete this object!! 181b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project EmojiFactory *factory = reinterpret_cast<EmojiFactory *>(nativeEmojiFactory); 182b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project delete factory; 183c81c43991c3522451dbea1743a33d8f7e5446979Daisuke Miyakawa */ 184b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project} 185b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 186b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Projectstatic jint android_emoji_EmojiFactory_getAndroidPuaFromVendorSpecificSjis( 187b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project JNIEnv* env, jobject obj, jint nativeEmojiFactory, jchar sjis) { 188b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project EmojiFactory *factory = reinterpret_cast<EmojiFactory *>(nativeEmojiFactory); 189b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project return factory->GetAndroidPuaFromVendorSpecificSjis(sjis); 190b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project} 191b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 192b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Projectstatic jint android_emoji_EmojiFactory_getVendorSpecificSjisFromAndroidPua( 193b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project JNIEnv* env, jobject obj, jint nativeEmojiFactory, jint pua) { 194b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project EmojiFactory *factory = reinterpret_cast<EmojiFactory *>(nativeEmojiFactory); 195b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project return factory->GetVendorSpecificSjisFromAndroidPua(pua); 196b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project} 197b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 198b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Projectstatic jint android_emoji_EmojiFactory_getAndroidPuaFromVendorSpecificPua( 199b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project JNIEnv* env, jobject obj, jint nativeEmojiFactory, jint vsu) { 200b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project EmojiFactory *factory = reinterpret_cast<EmojiFactory *>(nativeEmojiFactory); 201b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project return factory->GetAndroidPuaFromVendorSpecificPua(vsu); 202b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project} 203b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 204b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Projectstatic jint android_emoji_EmojiFactory_getVendorSpecificPuaFromAndroidPua( 205b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project JNIEnv* env, jobject obj, jint nativeEmojiFactory, jint pua) { 206b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project EmojiFactory *factory = reinterpret_cast<EmojiFactory *>(nativeEmojiFactory); 207b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project return factory->GetVendorSpecificPuaFromAndroidPua(pua); 208b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project} 209b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 210b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Projectstatic jint android_emoji_EmojiFactory_getMaximumVendorSpecificPua( 211b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project JNIEnv* env, jobject obj, jint nativeEmojiFactory) { 212b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project EmojiFactory *factory = reinterpret_cast<EmojiFactory *>(nativeEmojiFactory); 213b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project return factory->GetMaximumVendorSpecificPua(); 214b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project} 215b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 216b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Projectstatic jint android_emoji_EmojiFactory_getMinimumVendorSpecificPua( 217b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project JNIEnv* env, jobject obj, jint nativeEmojiFactory) { 218b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project EmojiFactory *factory = reinterpret_cast<EmojiFactory *>(nativeEmojiFactory); 219b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project return factory->GetMinimumVendorSpecificPua(); 220b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project} 221b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 222b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Projectstatic jint android_emoji_EmojiFactory_getMaximumAndroidPua( 223b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project JNIEnv* env, jobject obj, jint nativeEmojiFactory) { 224b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project EmojiFactory *factory = reinterpret_cast<EmojiFactory *>(nativeEmojiFactory); 225b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project return factory->GetMaximumAndroidPua(); 226b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project} 227b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 228b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Projectstatic jint android_emoji_EmojiFactory_getMinimumAndroidPua( 229b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project JNIEnv* env, jobject obj, jint nativeEmojiFactory) { 230b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project EmojiFactory *factory = reinterpret_cast<EmojiFactory *>(nativeEmojiFactory); 231b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project return factory->GetMinimumAndroidPua(); 232b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project} 233b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 234b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Projectstatic JNINativeMethod gMethods[] = { 235b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project { "newInstance", "(Ljava/lang/String;)Landroid/emoji/EmojiFactory;", 236b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project (void*)android_emoji_EmojiFactory_newInstance}, 237b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project { "newAvailableInstance", "()Landroid/emoji/EmojiFactory;", 238b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project (void*)android_emoji_EmojiFactory_newAvailableInstance}, 239b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project { "nativeDestructor", "(I)V", 240b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project (void*)android_emoji_EmojiFactory_destructor}, 241b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project { "nativeGetBitmapFromAndroidPua", "(II)Landroid/graphics/Bitmap;", 242b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project (void*)android_emoji_EmojiFactory_getBitmapFromAndroidPua}, 243b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project { "nativeGetAndroidPuaFromVendorSpecificSjis", "(IC)I", 244b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project (void*)android_emoji_EmojiFactory_getAndroidPuaFromVendorSpecificSjis}, 245b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project { "nativeGetVendorSpecificSjisFromAndroidPua", "(II)I", 246b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project (void*)android_emoji_EmojiFactory_getVendorSpecificSjisFromAndroidPua}, 247b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project { "nativeGetAndroidPuaFromVendorSpecificPua", "(II)I", 248b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project (void*)android_emoji_EmojiFactory_getAndroidPuaFromVendorSpecificPua}, 249b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project { "nativeGetVendorSpecificPuaFromAndroidPua", "(II)I", 250b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project (void*)android_emoji_EmojiFactory_getVendorSpecificPuaFromAndroidPua}, 251b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project { "nativeGetMaximumVendorSpecificPua", "(I)I", 252b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project (void*)android_emoji_EmojiFactory_getMaximumVendorSpecificPua}, 253b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project { "nativeGetMinimumVendorSpecificPua", "(I)I", 254b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project (void*)android_emoji_EmojiFactory_getMinimumVendorSpecificPua}, 255b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project { "nativeGetMaximumAndroidPua", "(I)I", 256b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project (void*)android_emoji_EmojiFactory_getMaximumAndroidPua}, 257b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project { "nativeGetMinimumAndroidPua", "(I)I", 258b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project (void*)android_emoji_EmojiFactory_getMinimumAndroidPua} 259b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project}; 260b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 261b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Projectstatic jclass make_globalref(JNIEnv* env, const char classname[]) 262b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project{ 263b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project jclass c = env->FindClass(classname); 264b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project SkASSERT(c); 265b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project return (jclass)env->NewGlobalRef(c); 266b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project} 267b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 268b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Projectstatic jfieldID getFieldIDCheck(JNIEnv* env, jclass clazz, 269b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project const char fieldname[], const char type[]) 270b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project{ 271b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project jfieldID id = env->GetFieldID(clazz, fieldname, type); 272b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project SkASSERT(id); 273b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project return id; 274b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project} 275b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 276b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Projectint register_android_emoji_EmojiFactory(JNIEnv* env) { 277b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project gEmojiFactory_class = make_globalref(env, "android/emoji/EmojiFactory"); 278b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project gEmojiFactory_constructorMethodID = env->GetMethodID( 279b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project gEmojiFactory_class, "<init>", "(ILjava/lang/String;)V"); 280b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project return jniRegisterNativeMethods(env, "android/emoji/EmojiFactory", 281b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project gMethods, NELEM(gMethods)); 282b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project} 283b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project 284b2a3dd88a53cc8c6d19f6dc8ec4f3d6c4abd9b54The Android Open Source Project} // namespace android 285