1987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe/*
2987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe * Copyright (C) 2014 The Android Open Source Project
3987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe *
4987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe * Licensed under the Apache License, Version 2.0 (the "License");
5987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe * you may not use this file except in compliance with the License.
6987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe * You may obtain a copy of the License at
7987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe *
8987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe *      http://www.apache.org/licenses/LICENSE-2.0
9987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe *
10987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe * Unless required by applicable law or agreed to in writing, software
11987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe * distributed under the License is distributed on an "AS IS" BASIS,
12987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe * See the License for the specific language governing permissions and
14987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe * limitations under the License.
15987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe */
16987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe
17987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe#ifndef CORE_JNI_HELPERS
18987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe#define CORE_JNI_HELPERS
19987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe
20987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe#include "JNIHelp.h"
21987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe#include <android_runtime/AndroidRuntime.h>
22987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe
23987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampenamespace android {
24987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe
25987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe// Defines some helpful functions.
26987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe
27987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampestatic inline jclass FindClassOrDie(JNIEnv* env, const char* class_name) {
28987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    jclass clazz = env->FindClass(class_name);
29987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    LOG_ALWAYS_FATAL_IF(clazz == NULL, "Unable to find class %s", class_name);
30987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    return clazz;
31987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe}
32987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe
33987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampestatic inline jfieldID GetFieldIDOrDie(JNIEnv* env, jclass clazz, const char* field_name,
34987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe                                       const char* field_signature) {
35987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    jfieldID res = env->GetFieldID(clazz, field_name, field_signature);
36987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    LOG_ALWAYS_FATAL_IF(res == NULL, "Unable to find static field %s", field_name);
37987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    return res;
38987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe}
39987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe
40987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampestatic inline jmethodID GetMethodIDOrDie(JNIEnv* env, jclass clazz, const char* method_name,
41987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe                                         const char* method_signature) {
42987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    jmethodID res = env->GetMethodID(clazz, method_name, method_signature);
43987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    LOG_ALWAYS_FATAL_IF(res == NULL, "Unable to find method %s", method_name);
44987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    return res;
45987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe}
46987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe
47987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampestatic inline jfieldID GetStaticFieldIDOrDie(JNIEnv* env, jclass clazz, const char* field_name,
48987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe                                             const char* field_signature) {
49987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    jfieldID res = env->GetStaticFieldID(clazz, field_name, field_signature);
50987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    LOG_ALWAYS_FATAL_IF(res == NULL, "Unable to find static field %s", field_name);
51987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    return res;
52987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe}
53987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe
54987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampestatic inline jmethodID GetStaticMethodIDOrDie(JNIEnv* env, jclass clazz, const char* method_name,
55987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe                                               const char* method_signature) {
56987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    jmethodID res = env->GetStaticMethodID(clazz, method_name, method_signature);
57987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    LOG_ALWAYS_FATAL_IF(res == NULL, "Unable to find static method %s", method_name);
58987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    return res;
59987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe}
60987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe
61987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampetemplate <typename T>
62987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampestatic inline T MakeGlobalRefOrDie(JNIEnv* env, T in) {
63987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    jobject res = env->NewGlobalRef(in);
64987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    LOG_ALWAYS_FATAL_IF(res == NULL, "Unable to create global reference.");
65987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    return static_cast<T>(res);
66987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe}
67987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe
68987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampestatic inline int RegisterMethodsOrDie(JNIEnv* env, const char* className,
69987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe                                       const JNINativeMethod* gMethods, int numMethods) {
70987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    int res = AndroidRuntime::registerNativeMethods(env, className, gMethods, numMethods);
71987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    LOG_ALWAYS_FATAL_IF(res < 0, "Unable to register native methods.");
72987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe    return res;
73987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe}
74987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe
75987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe}  // namespace android
76987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe
77987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe#endif  // CORE_JNI_HELPERS
78