Tomasz Wasilczyk | d7c21d3 | 2017-04-17 17:02:06 -0700 | [diff] [blame] | 1 | /** |
| 2 | * Copyright (C) 2017 The Android Open Source Project |
| 3 | * |
| 4 | * Licensed under the Apache License, Version 2.0 (the "License"); |
| 5 | * you may not use this file except in compliance with the License. |
| 6 | * You may obtain a copy of the License at |
| 7 | * |
| 8 | * http://www.apache.org/licenses/LICENSE-2.0 |
| 9 | * |
| 10 | * Unless required by applicable law or agreed to in writing, software |
| 11 | * distributed under the License is distributed on an "AS IS" BASIS, |
| 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 13 | * See the License for the specific language governing permissions and |
| 14 | * limitations under the License. |
| 15 | */ |
| 16 | |
Tomasz Wasilczyk | 6b4b646 | 2017-07-19 10:52:28 -0700 | [diff] [blame] | 17 | #define LOG_TAG "BroadcastRadioService.jni" |
Tomasz Wasilczyk | d7c21d3 | 2017-04-17 17:02:06 -0700 | [diff] [blame] | 18 | #define LOG_NDEBUG 0 |
| 19 | |
Tomasz Wasilczyk | 6b4b646 | 2017-07-19 10:52:28 -0700 | [diff] [blame] | 20 | #include "BroadcastRadioService.h" |
Tomasz Wasilczyk | d7c21d3 | 2017-04-17 17:02:06 -0700 | [diff] [blame] | 21 | |
Tomasz Wasilczyk | 6b4b646 | 2017-07-19 10:52:28 -0700 | [diff] [blame] | 22 | #include "Tuner.h" |
| 23 | #include "convert.h" |
Tomasz Wasilczyk | d7c21d3 | 2017-04-17 17:02:06 -0700 | [diff] [blame] | 24 | |
Tomasz Wasilczyk | 2383793 | 2017-05-05 08:42:10 -0700 | [diff] [blame] | 25 | #include <android/hardware/broadcastradio/1.1/IBroadcastRadio.h> |
Tomasz Wasilczyk | 20eef7d | 2017-09-14 09:42:54 -0700 | [diff] [blame] | 26 | #include <android/hardware/broadcastradio/1.2/IBroadcastRadioFactory.h> |
Tomasz Wasilczyk | d15c9df | 2017-06-13 10:10:36 -0700 | [diff] [blame] | 27 | #include <android/hidl/manager/1.0/IServiceManager.h> |
Tomasz Wasilczyk | 8e67a33 | 2017-12-04 09:54:56 -0800 | [diff] [blame] | 28 | #include <broadcastradio-utils-1x/Utils.h> |
Tomasz Wasilczyk | d7c21d3 | 2017-04-17 17:02:06 -0700 | [diff] [blame] | 29 | #include <core_jni_helpers.h> |
Tomasz Wasilczyk | d15c9df | 2017-06-13 10:10:36 -0700 | [diff] [blame] | 30 | #include <hidl/ServiceManagement.h> |
Tomasz Wasilczyk | e3e8f90 | 2017-07-26 09:11:05 -0700 | [diff] [blame] | 31 | #include <nativehelper/JNIHelp.h> |
Tomasz Wasilczyk | d7c21d3 | 2017-04-17 17:02:06 -0700 | [diff] [blame] | 32 | #include <utils/Log.h> |
Tomasz Wasilczyk | d7c21d3 | 2017-04-17 17:02:06 -0700 | [diff] [blame] | 33 | |
| 34 | namespace android { |
Tomasz Wasilczyk | 2134817 | 2017-04-20 14:02:42 -0700 | [diff] [blame] | 35 | namespace server { |
Tomasz Wasilczyk | 6b4b646 | 2017-07-19 10:52:28 -0700 | [diff] [blame] | 36 | namespace BroadcastRadio { |
| 37 | namespace BroadcastRadioService { |
Tomasz Wasilczyk | d7c21d3 | 2017-04-17 17:02:06 -0700 | [diff] [blame] | 38 | |
Tomasz Wasilczyk | e3e8f90 | 2017-07-26 09:11:05 -0700 | [diff] [blame] | 39 | using std::lock_guard; |
| 40 | using std::mutex; |
| 41 | |
Tomasz Wasilczyk | d7c21d3 | 2017-04-17 17:02:06 -0700 | [diff] [blame] | 42 | using hardware::Return; |
Tomasz Wasilczyk | d15c9df | 2017-06-13 10:10:36 -0700 | [diff] [blame] | 43 | using hardware::hidl_string; |
Tomasz Wasilczyk | d7c21d3 | 2017-04-17 17:02:06 -0700 | [diff] [blame] | 44 | using hardware::hidl_vec; |
| 45 | |
| 46 | namespace V1_0 = hardware::broadcastradio::V1_0; |
| 47 | namespace V1_1 = hardware::broadcastradio::V1_1; |
Tomasz Wasilczyk | 20eef7d | 2017-09-14 09:42:54 -0700 | [diff] [blame] | 48 | namespace V1_2 = hardware::broadcastradio::V1_2; |
| 49 | namespace utils = hardware::broadcastradio::utils; |
Tomasz Wasilczyk | d7c21d3 | 2017-04-17 17:02:06 -0700 | [diff] [blame] | 50 | |
| 51 | using V1_0::BandConfig; |
Tomasz Wasilczyk | 20eef7d | 2017-09-14 09:42:54 -0700 | [diff] [blame] | 52 | using V1_0::Class; |
Tomasz Wasilczyk | d7c21d3 | 2017-04-17 17:02:06 -0700 | [diff] [blame] | 53 | using V1_0::ITuner; |
Tomasz Wasilczyk | 20eef7d | 2017-09-14 09:42:54 -0700 | [diff] [blame] | 54 | using V1_0::MetaData; |
| 55 | using V1_0::ProgramInfo; |
| 56 | using V1_0::Result; |
| 57 | using utils::HalRevision; |
Tomasz Wasilczyk | d7c21d3 | 2017-04-17 17:02:06 -0700 | [diff] [blame] | 58 | |
Tomasz Wasilczyk | e3e8f90 | 2017-07-26 09:11:05 -0700 | [diff] [blame] | 59 | static mutex gContextMutex; |
Tomasz Wasilczyk | d7c21d3 | 2017-04-17 17:02:06 -0700 | [diff] [blame] | 60 | |
Tomasz Wasilczyk | f13b841 | 2017-05-09 11:54:35 -0700 | [diff] [blame] | 61 | static struct { |
| 62 | struct { |
| 63 | jclass clazz; |
| 64 | jmethodID cstor; |
Tomasz Wasilczyk | d15c9df | 2017-06-13 10:10:36 -0700 | [diff] [blame] | 65 | jmethodID add; |
| 66 | } ArrayList; |
| 67 | struct { |
| 68 | jclass clazz; |
| 69 | jmethodID cstor; |
Tomasz Wasilczyk | f13b841 | 2017-05-09 11:54:35 -0700 | [diff] [blame] | 70 | } Tuner; |
Tomasz Wasilczyk | f13b841 | 2017-05-09 11:54:35 -0700 | [diff] [blame] | 71 | } gjni; |
Tomasz Wasilczyk | d7c21d3 | 2017-04-17 17:02:06 -0700 | [diff] [blame] | 72 | |
Tomasz Wasilczyk | 20eef7d | 2017-09-14 09:42:54 -0700 | [diff] [blame] | 73 | struct Module { |
| 74 | sp<V1_0::IBroadcastRadio> radioModule; |
| 75 | HalRevision halRev; |
| 76 | }; |
| 77 | |
Tomasz Wasilczyk | d7c21d3 | 2017-04-17 17:02:06 -0700 | [diff] [blame] | 78 | struct ServiceContext { |
| 79 | ServiceContext() {} |
| 80 | |
Tomasz Wasilczyk | 20eef7d | 2017-09-14 09:42:54 -0700 | [diff] [blame] | 81 | std::vector<Module> mModules; |
Tomasz Wasilczyk | d7c21d3 | 2017-04-17 17:02:06 -0700 | [diff] [blame] | 82 | |
| 83 | private: |
| 84 | DISALLOW_COPY_AND_ASSIGN(ServiceContext); |
| 85 | }; |
| 86 | |
Tomasz Wasilczyk | d15c9df | 2017-06-13 10:10:36 -0700 | [diff] [blame] | 87 | const std::vector<Class> gAllClasses = { |
| 88 | Class::AM_FM, |
| 89 | Class::SAT, |
| 90 | Class::DT, |
| 91 | }; |
| 92 | |
Tomasz Wasilczyk | d7c21d3 | 2017-04-17 17:02:06 -0700 | [diff] [blame] | 93 | |
| 94 | /** |
| 95 | * Always lock gContextMutex when using native context. |
| 96 | */ |
| 97 | static ServiceContext& getNativeContext(jlong nativeContextHandle) { |
| 98 | auto nativeContext = reinterpret_cast<ServiceContext*>(nativeContextHandle); |
| 99 | LOG_ALWAYS_FATAL_IF(nativeContext == nullptr, "Native context not initialized"); |
| 100 | return *nativeContext; |
| 101 | } |
| 102 | |
| 103 | static jlong nativeInit(JNIEnv *env, jobject obj) { |
Tomasz Wasilczyk | e3e8f90 | 2017-07-26 09:11:05 -0700 | [diff] [blame] | 104 | ALOGV("%s", __func__); |
| 105 | lock_guard<mutex> lk(gContextMutex); |
Tomasz Wasilczyk | d7c21d3 | 2017-04-17 17:02:06 -0700 | [diff] [blame] | 106 | |
| 107 | auto nativeContext = new ServiceContext(); |
| 108 | static_assert(sizeof(jlong) >= sizeof(nativeContext), "jlong is smaller than a pointer"); |
| 109 | return reinterpret_cast<jlong>(nativeContext); |
| 110 | } |
| 111 | |
| 112 | static void nativeFinalize(JNIEnv *env, jobject obj, jlong nativeContext) { |
Tomasz Wasilczyk | e3e8f90 | 2017-07-26 09:11:05 -0700 | [diff] [blame] | 113 | ALOGV("%s", __func__); |
| 114 | lock_guard<mutex> lk(gContextMutex); |
Tomasz Wasilczyk | d7c21d3 | 2017-04-17 17:02:06 -0700 | [diff] [blame] | 115 | |
| 116 | auto ctx = reinterpret_cast<ServiceContext*>(nativeContext); |
| 117 | delete ctx; |
| 118 | } |
| 119 | |
Tomasz Wasilczyk | d15c9df | 2017-06-13 10:10:36 -0700 | [diff] [blame] | 120 | static jobject nativeLoadModules(JNIEnv *env, jobject obj, jlong nativeContext) { |
Tomasz Wasilczyk | e3e8f90 | 2017-07-26 09:11:05 -0700 | [diff] [blame] | 121 | ALOGV("%s", __func__); |
| 122 | lock_guard<mutex> lk(gContextMutex); |
Tomasz Wasilczyk | d7c21d3 | 2017-04-17 17:02:06 -0700 | [diff] [blame] | 123 | auto& ctx = getNativeContext(nativeContext); |
| 124 | |
Tomasz Wasilczyk | d15c9df | 2017-06-13 10:10:36 -0700 | [diff] [blame] | 125 | // Get list of registered HIDL HAL implementations. |
| 126 | auto manager = hardware::defaultServiceManager(); |
| 127 | hidl_vec<hidl_string> services; |
| 128 | if (manager == nullptr) { |
| 129 | ALOGE("Can't reach service manager, using default service implementation only"); |
| 130 | services = std::vector<hidl_string>({ "default" }); |
| 131 | } else { |
| 132 | manager->listByInterface(V1_0::IBroadcastRadioFactory::descriptor, |
| 133 | [&services](const hidl_vec<hidl_string> ®istered) { |
| 134 | services = registered; |
| 135 | }); |
Tomasz Wasilczyk | d7c21d3 | 2017-04-17 17:02:06 -0700 | [diff] [blame] | 136 | } |
| 137 | |
Tomasz Wasilczyk | d15c9df | 2017-06-13 10:10:36 -0700 | [diff] [blame] | 138 | // Scan provided list for actually implemented modules. |
| 139 | ctx.mModules.clear(); |
| 140 | auto jModules = make_javaref(env, env->NewObject(gjni.ArrayList.clazz, gjni.ArrayList.cstor)); |
| 141 | for (auto&& serviceName : services) { |
| 142 | ALOGV("checking service: %s", serviceName.c_str()); |
Tomasz Wasilczyk | d7c21d3 | 2017-04-17 17:02:06 -0700 | [diff] [blame] | 143 | |
Tomasz Wasilczyk | d15c9df | 2017-06-13 10:10:36 -0700 | [diff] [blame] | 144 | auto factory = V1_0::IBroadcastRadioFactory::getService(serviceName); |
| 145 | if (factory == nullptr) { |
| 146 | ALOGE("can't load service %s", serviceName.c_str()); |
| 147 | continue; |
Tomasz Wasilczyk | d7c21d3 | 2017-04-17 17:02:06 -0700 | [diff] [blame] | 148 | } |
Tomasz Wasilczyk | d7c21d3 | 2017-04-17 17:02:06 -0700 | [diff] [blame] | 149 | |
Tomasz Wasilczyk | 20eef7d | 2017-09-14 09:42:54 -0700 | [diff] [blame] | 150 | auto halRev = HalRevision::V1_0; |
| 151 | auto halMinor = 0; |
| 152 | if (V1_2::IBroadcastRadioFactory::castFrom(factory).withDefault(nullptr) != nullptr) { |
| 153 | halRev = HalRevision::V1_2; |
| 154 | halMinor = 2; |
| 155 | } else if (V1_1::IBroadcastRadioFactory::castFrom(factory).withDefault(nullptr) |
| 156 | != nullptr) { |
| 157 | halRev = HalRevision::V1_1; |
| 158 | halMinor = 1; |
| 159 | } |
| 160 | |
Tomasz Wasilczyk | d15c9df | 2017-06-13 10:10:36 -0700 | [diff] [blame] | 161 | // Second level of scanning - that's unfortunate. |
| 162 | for (auto&& clazz : gAllClasses) { |
| 163 | sp<V1_0::IBroadcastRadio> module10 = nullptr; |
| 164 | sp<V1_1::IBroadcastRadio> module11 = nullptr; |
| 165 | factory->connectModule(clazz, [&](Result res, const sp<V1_0::IBroadcastRadio>& module) { |
| 166 | if (res == Result::OK) { |
| 167 | module10 = module; |
| 168 | module11 = V1_1::IBroadcastRadio::castFrom(module).withDefault(nullptr); |
| 169 | } else if (res != Result::INVALID_ARGUMENTS) { |
| 170 | ALOGE("couldn't load %s:%s module", |
| 171 | serviceName.c_str(), V1_0::toString(clazz).c_str()); |
| 172 | } |
| 173 | }); |
| 174 | if (module10 == nullptr) continue; |
| 175 | |
| 176 | auto idx = ctx.mModules.size(); |
Tomasz Wasilczyk | 20eef7d | 2017-09-14 09:42:54 -0700 | [diff] [blame] | 177 | ctx.mModules.push_back({module10, halRev}); |
| 178 | ALOGI("loaded broadcast radio module %zu: %s:%s (HAL 1.%d)", |
| 179 | idx, serviceName.c_str(), V1_0::toString(clazz).c_str(), halMinor); |
Tomasz Wasilczyk | d15c9df | 2017-06-13 10:10:36 -0700 | [diff] [blame] | 180 | |
| 181 | JavaRef<jobject> jModule = nullptr; |
| 182 | Result halResult = Result::OK; |
| 183 | Return<void> hidlResult; |
| 184 | if (module11 != nullptr) { |
| 185 | hidlResult = module11->getProperties_1_1([&](const V1_1::Properties& properties) { |
| 186 | jModule = convert::ModulePropertiesFromHal(env, properties, idx, serviceName); |
| 187 | }); |
| 188 | } else { |
| 189 | hidlResult = module10->getProperties([&](Result result, |
| 190 | const V1_0::Properties& properties) { |
| 191 | halResult = result; |
| 192 | if (result != Result::OK) return; |
| 193 | jModule = convert::ModulePropertiesFromHal(env, properties, idx, serviceName); |
| 194 | }); |
| 195 | } |
| 196 | if (convert::ThrowIfFailed(env, hidlResult, halResult)) return nullptr; |
| 197 | |
| 198 | env->CallBooleanMethod(jModules.get(), gjni.ArrayList.add, jModule.get()); |
| 199 | } |
| 200 | } |
| 201 | |
| 202 | return jModules.release(); |
Tomasz Wasilczyk | d7c21d3 | 2017-04-17 17:02:06 -0700 | [diff] [blame] | 203 | } |
| 204 | |
Tomasz Wasilczyk | 2134817 | 2017-04-20 14:02:42 -0700 | [diff] [blame] | 205 | static jobject nativeOpenTuner(JNIEnv *env, jobject obj, long nativeContext, jint moduleId, |
| 206 | jobject bandConfig, bool withAudio, jobject callback) { |
Tomasz Wasilczyk | e3e8f90 | 2017-07-26 09:11:05 -0700 | [diff] [blame] | 207 | ALOGV("%s", __func__); |
| 208 | lock_guard<mutex> lk(gContextMutex); |
Tomasz Wasilczyk | d15c9df | 2017-06-13 10:10:36 -0700 | [diff] [blame] | 209 | auto& ctx = getNativeContext(nativeContext); |
Tomasz Wasilczyk | f13b841 | 2017-05-09 11:54:35 -0700 | [diff] [blame] | 210 | |
Tomasz Wasilczyk | 2134817 | 2017-04-20 14:02:42 -0700 | [diff] [blame] | 211 | if (callback == nullptr) { |
| 212 | ALOGE("Callback is empty"); |
| 213 | return nullptr; |
| 214 | } |
Tomasz Wasilczyk | d7c21d3 | 2017-04-17 17:02:06 -0700 | [diff] [blame] | 215 | |
Tomasz Wasilczyk | d15c9df | 2017-06-13 10:10:36 -0700 | [diff] [blame] | 216 | if (moduleId < 0 || static_cast<size_t>(moduleId) >= ctx.mModules.size()) { |
| 217 | ALOGE("Invalid module ID: %d", moduleId); |
Tomasz Wasilczyk | d7c21d3 | 2017-04-17 17:02:06 -0700 | [diff] [blame] | 218 | return nullptr; |
| 219 | } |
| 220 | |
Tomasz Wasilczyk | 20eef7d | 2017-09-14 09:42:54 -0700 | [diff] [blame] | 221 | ALOGI("Opening tuner %d", moduleId); |
| 222 | auto module = ctx.mModules[moduleId]; |
Tomasz Wasilczyk | 2383793 | 2017-05-05 08:42:10 -0700 | [diff] [blame] | 223 | |
Tomasz Wasilczyk | 31c8df0 | 2017-04-26 14:47:08 -0700 | [diff] [blame] | 224 | Region region; |
| 225 | BandConfig bandConfigHal = convert::BandConfigToHal(env, bandConfig, region); |
| 226 | |
Tomasz Wasilczyk | cc0b479 | 2017-06-16 10:29:27 -0700 | [diff] [blame] | 227 | auto tuner = make_javaref(env, env->NewObject(gjni.Tuner.clazz, gjni.Tuner.cstor, |
Tomasz Wasilczyk | 20eef7d | 2017-09-14 09:42:54 -0700 | [diff] [blame] | 228 | callback, module.halRev, region, withAudio, bandConfigHal.type)); |
Tomasz Wasilczyk | d7c21d3 | 2017-04-17 17:02:06 -0700 | [diff] [blame] | 229 | if (tuner == nullptr) { |
| 230 | ALOGE("Unable to create new tuner object."); |
| 231 | return nullptr; |
| 232 | } |
| 233 | |
Tomasz Wasilczyk | 2134817 | 2017-04-20 14:02:42 -0700 | [diff] [blame] | 234 | auto tunerCb = Tuner::getNativeCallback(env, tuner); |
Tomasz Wasilczyk | d7c21d3 | 2017-04-17 17:02:06 -0700 | [diff] [blame] | 235 | Result halResult; |
| 236 | sp<ITuner> halTuner = nullptr; |
| 237 | |
Tomasz Wasilczyk | 20eef7d | 2017-09-14 09:42:54 -0700 | [diff] [blame] | 238 | auto hidlResult = module.radioModule->openTuner(bandConfigHal, withAudio, tunerCb, |
Tomasz Wasilczyk | d7c21d3 | 2017-04-17 17:02:06 -0700 | [diff] [blame] | 239 | [&](Result result, const sp<ITuner>& tuner) { |
| 240 | halResult = result; |
| 241 | halTuner = tuner; |
| 242 | }); |
| 243 | if (!hidlResult.isOk() || halResult != Result::OK || halTuner == nullptr) { |
| 244 | ALOGE("Couldn't open tuner"); |
| 245 | ALOGE_IF(hidlResult.isOk(), "halResult = %d", halResult); |
| 246 | ALOGE_IF(!hidlResult.isOk(), "hidlResult = %s", hidlResult.description().c_str()); |
Tomasz Wasilczyk | d7c21d3 | 2017-04-17 17:02:06 -0700 | [diff] [blame] | 247 | return nullptr; |
| 248 | } |
| 249 | |
Tomasz Wasilczyk | 20eef7d | 2017-09-14 09:42:54 -0700 | [diff] [blame] | 250 | Tuner::assignHalInterfaces(env, tuner, module.radioModule, halTuner); |
Tomasz Wasilczyk | 1475237 | 2017-06-21 11:58:21 -0700 | [diff] [blame] | 251 | ALOGD("Opened tuner %p", halTuner.get()); |
Tomasz Wasilczyk | 3b4465e | 2018-01-14 21:47:44 -0800 | [diff] [blame] | 252 | |
| 253 | bool isConnected = true; |
| 254 | halTuner->getConfiguration([&](Result result, const BandConfig& config) { |
| 255 | if (result == Result::OK) isConnected = config.antennaConnected; |
| 256 | }); |
| 257 | if (!isConnected) { |
| 258 | tunerCb->antennaStateChange(false); |
| 259 | } |
| 260 | |
Tomasz Wasilczyk | f13b841 | 2017-05-09 11:54:35 -0700 | [diff] [blame] | 261 | return tuner.release(); |
Tomasz Wasilczyk | d7c21d3 | 2017-04-17 17:02:06 -0700 | [diff] [blame] | 262 | } |
| 263 | |
| 264 | static const JNINativeMethod gRadioServiceMethods[] = { |
| 265 | { "nativeInit", "()J", (void*)nativeInit }, |
| 266 | { "nativeFinalize", "(J)V", (void*)nativeFinalize }, |
Tomasz Wasilczyk | d15c9df | 2017-06-13 10:10:36 -0700 | [diff] [blame] | 267 | { "nativeLoadModules", "(J)Ljava/util/List;", (void*)nativeLoadModules }, |
Tomasz Wasilczyk | 2134817 | 2017-04-20 14:02:42 -0700 | [diff] [blame] | 268 | { "nativeOpenTuner", "(JILandroid/hardware/radio/RadioManager$BandConfig;Z" |
Tomasz Wasilczyk | df01326 | 2017-12-13 11:47:20 -0800 | [diff] [blame] | 269 | "Landroid/hardware/radio/ITunerCallback;)Lcom/android/server/broadcastradio/hal1/Tuner;", |
Tomasz Wasilczyk | 2134817 | 2017-04-20 14:02:42 -0700 | [diff] [blame] | 270 | (void*)nativeOpenTuner }, |
Tomasz Wasilczyk | d7c21d3 | 2017-04-17 17:02:06 -0700 | [diff] [blame] | 271 | }; |
| 272 | |
Tomasz Wasilczyk | 6b4b646 | 2017-07-19 10:52:28 -0700 | [diff] [blame] | 273 | } // namespace BroadcastRadioService |
| 274 | } // namespace BroadcastRadio |
Tomasz Wasilczyk | 2134817 | 2017-04-20 14:02:42 -0700 | [diff] [blame] | 275 | } // namespace server |
| 276 | |
Tomasz Wasilczyk | 6b4b646 | 2017-07-19 10:52:28 -0700 | [diff] [blame] | 277 | void register_android_server_broadcastradio_BroadcastRadioService(JNIEnv *env) { |
| 278 | using namespace server::BroadcastRadio::BroadcastRadioService; |
Tomasz Wasilczyk | 2134817 | 2017-04-20 14:02:42 -0700 | [diff] [blame] | 279 | |
Tomasz Wasilczyk | 6b4b646 | 2017-07-19 10:52:28 -0700 | [diff] [blame] | 280 | register_android_server_broadcastradio_convert(env); |
Tomasz Wasilczyk | 31c8df0 | 2017-04-26 14:47:08 -0700 | [diff] [blame] | 281 | |
Tomasz Wasilczyk | df01326 | 2017-12-13 11:47:20 -0800 | [diff] [blame] | 282 | auto tunerClass = FindClassOrDie(env, "com/android/server/broadcastradio/hal1/Tuner"); |
Tomasz Wasilczyk | f13b841 | 2017-05-09 11:54:35 -0700 | [diff] [blame] | 283 | gjni.Tuner.clazz = MakeGlobalRefOrDie(env, tunerClass); |
| 284 | gjni.Tuner.cstor = GetMethodIDOrDie(env, tunerClass, "<init>", |
Tomasz Wasilczyk | 8cfb0e8 | 2017-07-12 13:59:20 -0700 | [diff] [blame] | 285 | "(Landroid/hardware/radio/ITunerCallback;IIZI)V"); |
Tomasz Wasilczyk | d7c21d3 | 2017-04-17 17:02:06 -0700 | [diff] [blame] | 286 | |
Tomasz Wasilczyk | d15c9df | 2017-06-13 10:10:36 -0700 | [diff] [blame] | 287 | auto arrayListClass = FindClassOrDie(env, "java/util/ArrayList"); |
| 288 | gjni.ArrayList.clazz = MakeGlobalRefOrDie(env, arrayListClass); |
| 289 | gjni.ArrayList.cstor = GetMethodIDOrDie(env, arrayListClass, "<init>", "()V"); |
| 290 | gjni.ArrayList.add = GetMethodIDOrDie(env, arrayListClass, "add", "(Ljava/lang/Object;)Z"); |
| 291 | |
Tomasz Wasilczyk | 6b4b646 | 2017-07-19 10:52:28 -0700 | [diff] [blame] | 292 | auto res = jniRegisterNativeMethods(env, |
Tomasz Wasilczyk | df01326 | 2017-12-13 11:47:20 -0800 | [diff] [blame] | 293 | "com/android/server/broadcastradio/hal1/BroadcastRadioService", |
Tomasz Wasilczyk | d7c21d3 | 2017-04-17 17:02:06 -0700 | [diff] [blame] | 294 | gRadioServiceMethods, NELEM(gRadioServiceMethods)); |
| 295 | LOG_ALWAYS_FATAL_IF(res < 0, "Unable to register native methods."); |
| 296 | } |
| 297 | |
Tomasz Wasilczyk | 2134817 | 2017-04-20 14:02:42 -0700 | [diff] [blame] | 298 | } // namespace android |