From 7f26bf93a3042ebd510a3c923f3daa6a6855280c Mon Sep 17 00:00:00 2001 From: shubang Date: Sat, 13 May 2023 00:25:14 -0700 Subject: Fix type issues of TvMessage Some cpp types need to be converted to Java types in JNI. Otherwise there are "fault addr" errors. Bug: 278628657 Test: atest TvInputServiceTest Change-Id: Ic58230f4939e0f26df0fa0f9171423910923369b --- .../java/com/android/server/tv/TvInputHal.java | 1 + services/core/jni/tvinput/JTvInputHal.cpp | 36 +++++++++++++--------- 2 files changed, 23 insertions(+), 14 deletions(-) diff --git a/services/core/java/com/android/server/tv/TvInputHal.java b/services/core/java/com/android/server/tv/TvInputHal.java index c05d148d50d8..87ebdbfbf4e8 100644 --- a/services/core/java/com/android/server/tv/TvInputHal.java +++ b/services/core/java/com/android/server/tv/TvInputHal.java @@ -234,6 +234,7 @@ final class TvInputHal implements Handler.Callback { int type = msg.arg2; Bundle data = (Bundle) msg.obj; mCallback.onTvMessage(deviceId, type, data); + break; } default: diff --git a/services/core/jni/tvinput/JTvInputHal.cpp b/services/core/jni/tvinput/JTvInputHal.cpp index a3eb3906cc65..6782b5c8d784 100644 --- a/services/core/jni/tvinput/JTvInputHal.cpp +++ b/services/core/jni/tvinput/JTvInputHal.cpp @@ -16,6 +16,8 @@ #include "JTvInputHal.h" +#include + namespace android { JTvInputHal::JTvInputHal(JNIEnv* env, jobject thiz, std::shared_ptr tvInput, @@ -278,21 +280,27 @@ void JTvInputHal::onStreamConfigurationsChanged(int deviceId, int cableConnectio void JTvInputHal::onTvMessage(int deviceId, int streamId, AidlTvMessageEventType type, AidlTvMessage& message, signed char data[], int dataLength) { JNIEnv* env = AndroidRuntime::getJNIEnv(); - jobject bundle = env->NewObject(gBundleClassInfo.clazz, gBundleClassInfo.constructor); - const jsize len = static_cast(dataLength); - jbyteArray convertedData = env->NewByteArray(len); - env->SetByteArrayRegion(convertedData, 0, len, reinterpret_cast(data)); - env->CallObjectMethod(bundle, gBundleClassInfo.putString, - "android.media.tv.TvInputManager.subtype", message.subType.c_str()); - env->CallObjectMethod(bundle, gBundleClassInfo.putByteArray, - "android.media.tv.TvInputManager.raw_data", convertedData); - env->CallObjectMethod(bundle, gBundleClassInfo.putInt, - "android.media.tv.TvInputManager.group_id", message.groupId); - env->CallObjectMethod(bundle, gBundleClassInfo.putInt, - "android.media.tv.TvInputManager.stream_id", streamId); + ScopedLocalRef bundle(env, + env->NewObject(gBundleClassInfo.clazz, + gBundleClassInfo.constructor)); + ScopedLocalRef convertedData(env, env->NewByteArray(dataLength)); + env->SetByteArrayRegion(convertedData.get(), 0, dataLength, reinterpret_cast(data)); + std::string key = "android.media.tv.TvInputManager.raw_data"; + ScopedLocalRef jkey(env, env->NewStringUTF(key.c_str())); + env->CallVoidMethod(bundle.get(), gBundleClassInfo.putByteArray, jkey.get(), + convertedData.get()); + ScopedLocalRef subtype(env, env->NewStringUTF(message.subType.c_str())); + key = "android.media.tv.TvInputManager.subtype"; + jkey = ScopedLocalRef(env, env->NewStringUTF(key.c_str())); + env->CallVoidMethod(bundle.get(), gBundleClassInfo.putString, jkey.get(), subtype.get()); + key = "android.media.tv.TvInputManager.group_id"; + jkey = ScopedLocalRef(env, env->NewStringUTF(key.c_str())); + env->CallVoidMethod(bundle.get(), gBundleClassInfo.putInt, jkey.get(), message.groupId); + key = "android.media.tv.TvInputManager.stream_id"; + jkey = ScopedLocalRef(env, env->NewStringUTF(key.c_str())); + env->CallVoidMethod(bundle.get(), gBundleClassInfo.putInt, jkey.get(), streamId); env->CallVoidMethod(mThiz, gTvInputHalClassInfo.tvMessageReceived, deviceId, - static_cast(type), bundle); - env->DeleteLocalRef(convertedData); + static_cast(type), bundle.get()); } void JTvInputHal::onCaptured(int deviceId, int streamId, uint32_t seq, bool succeeded) { -- cgit v1.2.3-59-g8ed1b