| OLD | NEW |
| (Empty) |
| 1 /* | |
| 2 * This file is part of Adblock Plus <https://adblockplus.org/>, | |
| 3 * Copyright (C) 2006-present eyeo GmbH | |
| 4 * | |
| 5 * Adblock Plus is free software: you can redistribute it and/or modify | |
| 6 * it under the terms of the GNU General Public License version 3 as | |
| 7 * published by the Free Software Foundation. | |
| 8 * | |
| 9 * Adblock Plus is distributed in the hope that it will be useful, | |
| 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 12 * GNU General Public License for more details. | |
| 13 * | |
| 14 * You should have received a copy of the GNU General Public License | |
| 15 * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. | |
| 16 */ | |
| 17 | |
| 18 #include <AdblockPlus.h> | |
| 19 #include "Utils.h" | |
| 20 #include "JniJsValue.h" | |
| 21 | |
| 22 // precached in JNI_OnLoad and released in JNI_OnUnload | |
| 23 JniGlobalReference<jclass>* jsValueClass; | |
| 24 jmethodID jsValueCtor; | |
| 25 | |
| 26 void JniJsValue_OnLoad(JavaVM* vm, JNIEnv* env, void* reserved) | |
| 27 { | |
| 28 jsValueClass = new JniGlobalReference<jclass>(env, env->FindClass(PKG("JsValue
"))); | |
| 29 jsValueCtor = env->GetMethodID(jsValueClass->Get(), "<init>", "(J)V"); | |
| 30 } | |
| 31 | |
| 32 void JniJsValue_OnUnload(JavaVM* vm, JNIEnv* env, void* reserved) | |
| 33 { | |
| 34 if (jsValueClass) | |
| 35 { | |
| 36 delete jsValueClass; | |
| 37 jsValueClass = NULL; | |
| 38 } | |
| 39 } | |
| 40 | |
| 41 jclass GetJsValueClass() | |
| 42 { | |
| 43 return (jsValueClass != NULL ? jsValueClass->Get() : NULL); | |
| 44 } | |
| 45 | |
| 46 static jboolean JNICALL JniIsUndefined(JNIEnv* env, jclass clazz, jlong ptr) | |
| 47 { | |
| 48 try | |
| 49 { | |
| 50 return JniGetJsValuePtr(ptr)->IsUndefined() ? JNI_TRUE : JNI_FALSE; | |
| 51 } | |
| 52 CATCH_THROW_AND_RETURN(env, JNI_FALSE) | |
| 53 } | |
| 54 | |
| 55 static jboolean JNICALL JniIsNull(JNIEnv* env, jclass clazz, jlong ptr) | |
| 56 { | |
| 57 try | |
| 58 { | |
| 59 return JniGetJsValuePtr(ptr)->IsNull() ? JNI_TRUE : JNI_FALSE; | |
| 60 } | |
| 61 CATCH_THROW_AND_RETURN(env, JNI_FALSE) | |
| 62 } | |
| 63 | |
| 64 static jboolean JNICALL JniIsNumber(JNIEnv* env, jclass clazz, jlong ptr) | |
| 65 { | |
| 66 try | |
| 67 { | |
| 68 return JniGetJsValuePtr(ptr)->IsNumber() ? JNI_TRUE : JNI_FALSE; | |
| 69 } | |
| 70 CATCH_THROW_AND_RETURN(env, JNI_FALSE) | |
| 71 } | |
| 72 | |
| 73 static jboolean JNICALL JniIsString(JNIEnv* env, jclass clazz, jlong ptr) | |
| 74 { | |
| 75 try | |
| 76 { | |
| 77 return JniGetJsValuePtr(ptr)->IsString() ? JNI_TRUE : JNI_FALSE; | |
| 78 } | |
| 79 CATCH_THROW_AND_RETURN(env, JNI_FALSE) | |
| 80 } | |
| 81 | |
| 82 static jboolean JNICALL JniIsBoolean(JNIEnv* env, jclass clazz, jlong ptr) | |
| 83 { | |
| 84 try | |
| 85 { | |
| 86 return JniGetJsValuePtr(ptr)->IsBool() ? JNI_TRUE : JNI_FALSE; | |
| 87 } | |
| 88 CATCH_THROW_AND_RETURN(env, JNI_FALSE) | |
| 89 } | |
| 90 | |
| 91 static jboolean JNICALL JniIsObject(JNIEnv* env, jclass clazz, jlong ptr) | |
| 92 { | |
| 93 try | |
| 94 { | |
| 95 return JniGetJsValuePtr(ptr)->IsObject() ? JNI_TRUE : JNI_FALSE; | |
| 96 } | |
| 97 CATCH_THROW_AND_RETURN(env, JNI_FALSE) | |
| 98 } | |
| 99 | |
| 100 static jboolean JNICALL JniIsArray(JNIEnv* env, jclass clazz, jlong ptr) | |
| 101 { | |
| 102 try | |
| 103 { | |
| 104 return JniGetJsValuePtr(ptr)->IsArray() ? JNI_TRUE : JNI_FALSE; | |
| 105 } | |
| 106 CATCH_THROW_AND_RETURN(env, JNI_FALSE) | |
| 107 } | |
| 108 | |
| 109 static jboolean JNICALL JniIsFunction(JNIEnv* env, jclass clazz, jlong ptr) | |
| 110 { | |
| 111 try | |
| 112 { | |
| 113 return JniGetJsValuePtr(ptr)->IsFunction() ? JNI_TRUE : JNI_FALSE; | |
| 114 } | |
| 115 CATCH_THROW_AND_RETURN(env, JNI_FALSE) | |
| 116 } | |
| 117 | |
| 118 static jstring JNICALL JniAsString(JNIEnv* env, jclass clazz, jlong ptr) | |
| 119 { | |
| 120 try | |
| 121 { | |
| 122 AdblockPlus::JsValue* jsValue = JniGetJsValuePtr(ptr); | |
| 123 return env->NewStringUTF(jsValue->AsString().c_str()); | |
| 124 } | |
| 125 CATCH_THROW_AND_RETURN(env, 0) | |
| 126 } | |
| 127 | |
| 128 static jlong JNICALL JniAsLong(JNIEnv* env, jclass clazz, jlong ptr) | |
| 129 { | |
| 130 try | |
| 131 { | |
| 132 return static_cast<jlong>(JniGetJsValuePtr(ptr)->AsInt()); | |
| 133 } | |
| 134 CATCH_THROW_AND_RETURN(env, 0) | |
| 135 } | |
| 136 | |
| 137 static jboolean JNICALL JniAsBoolean(JNIEnv* env, jclass clazz, jlong ptr) | |
| 138 { | |
| 139 try | |
| 140 { | |
| 141 return JniGetJsValuePtr(ptr)->AsBool() ? JNI_TRUE : JNI_FALSE; | |
| 142 } | |
| 143 CATCH_THROW_AND_RETURN(env, JNI_FALSE) | |
| 144 } | |
| 145 | |
| 146 static jobject JNICALL JniAsList(JNIEnv* env, jclass clazz, jlong ptr) | |
| 147 { | |
| 148 try | |
| 149 { | |
| 150 return JniJsValueListToArrayList(env, JniGetJsValuePtr(ptr)->AsList()); | |
| 151 } | |
| 152 CATCH_THROW_AND_RETURN(env, 0) | |
| 153 } | |
| 154 | |
| 155 static jobject JNICALL JniGetProperty(JNIEnv* env, jclass clazz, jlong ptr, jstr
ing name) | |
| 156 { | |
| 157 try | |
| 158 { | |
| 159 return NewJniJsValue(env, JniGetJsValuePtr(ptr)->GetProperty(JniJavaToStdStr
ing(env, name))); | |
| 160 } | |
| 161 CATCH_THROW_AND_RETURN(env, 0) | |
| 162 } | |
| 163 | |
| 164 static void JNICALL JniDtor(JNIEnv* env, jclass clazz, jlong ptr) | |
| 165 { | |
| 166 delete JniLongToTypePtr<AdblockPlus::JsValue>(ptr); | |
| 167 } | |
| 168 | |
| 169 jobject NewJniJsValue(JNIEnv* env, AdblockPlus::JsValue&& jsValue, jclass jsValu
eClassArg) | |
| 170 { | |
| 171 auto pJsValue = reinterpret_cast<uintptr_t>(new AdblockPlus::JsValue(std::move
(jsValue))); | |
| 172 return env->NewObject(jsValueClass->Get(), jsValueCtor, static_cast<jlong>(pJs
Value)); | |
| 173 } | |
| 174 | |
| 175 AdblockPlus::JsValue* JniGetJsValuePtr(jlong ptr) | |
| 176 { | |
| 177 return JniLongToTypePtr<AdblockPlus::JsValue>(ptr); | |
| 178 } | |
| 179 | |
| 180 AdblockPlus::JsValue& JniGetJsValue(jlong ptr) | |
| 181 { | |
| 182 return *JniLongToTypePtr<AdblockPlus::JsValue>(ptr); | |
| 183 } | |
| 184 | |
| 185 jobject JniJsValueListToArrayList(JNIEnv* env, AdblockPlus::JsValueList&& list) | |
| 186 { | |
| 187 jobject arrayList = NewJniArrayList(env); | |
| 188 | |
| 189 for (AdblockPlus::JsValueList::iterator it = list.begin(), end = list.end(); i
t != end; ++it) | |
| 190 { | |
| 191 JniAddObjectToList(env, arrayList, *JniLocalReference<jobject>(env, NewJniJs
Value(env, std::move(*it)))); | |
| 192 } | |
| 193 | |
| 194 return arrayList; | |
| 195 } | |
| 196 | |
| 197 // TODO: List of functions that lack JNI bindings | |
| 198 //std::vector<std::string> GetOwnPropertyNames() const; | |
| 199 //void SetProperty(const std::string& name, const std::string& val); | |
| 200 //void SetProperty(const std::string& name, int64_t val); | |
| 201 //void SetProperty(const std::string& name, bool val); | |
| 202 //void SetProperty(const std::string& name, JsValue value); | |
| 203 //void SetProperty(const std::string& name, const char* val); | |
| 204 //inline void SetProperty(const std::string& name, int val); | |
| 205 //std::string GetClass() const; | |
| 206 //JsValue Call(const JsValueList& params = JsValueList(), AdblockPlus::JsValue t
hisPtr = AdblockPlus::JsValue()) const; | |
| 207 | |
| 208 static JNINativeMethod methods[] = | |
| 209 { | |
| 210 { (char*)"isUndefined", (char*)"(J)Z", (void*)JniIsUndefined }, | |
| 211 { (char*)"isNull", (char*)"(J)Z", (void*)JniIsNull }, | |
| 212 { (char*)"isNumber", (char*)"(J)Z", (void*)JniIsNumber }, | |
| 213 { (char*)"isString", (char*)"(J)Z", (void*)JniIsString }, | |
| 214 { (char*)"isBoolean", (char*)"(J)Z", (void*)JniIsBoolean }, | |
| 215 { (char*)"isObject", (char*)"(J)Z", (void*)JniIsObject }, | |
| 216 { (char*)"isArray", (char*)"(J)Z", (void*)JniIsArray }, | |
| 217 { (char*)"isFunction", (char*)"(J)Z", (void*)JniIsFunction }, | |
| 218 { (char*)"asString", (char*)"(J)Ljava/lang/String;", (void*)JniAsString }, | |
| 219 { (char*)"asLong", (char*)"(J)J", (void*)JniAsLong }, | |
| 220 { (char*)"asBoolean", (char*)"(J)Z", (void*)JniAsBoolean }, | |
| 221 { (char*)"asList", (char*)"(J)Ljava/util/List;", (void*)JniAsList }, | |
| 222 { (char*)"getProperty", (char*)"(JLjava/lang/String;)" TYP("JsValue"), (void*)
JniGetProperty }, | |
| 223 { (char*)"dtor", (char*)"(J)V", (void*)JniDtor } | |
| 224 }; | |
| 225 | |
| 226 extern "C" JNIEXPORT void JNICALL Java_org_adblockplus_libadblockplus_JsValue_re
gisterNatives(JNIEnv *env, jclass clazz) | |
| 227 { | |
| 228 env->RegisterNatives(clazz, methods, sizeof(methods) / sizeof(methods[0])); | |
| 229 } | |
| OLD | NEW |