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