diff options
author | Scott Lobdell <slobdell@google.com> | 2021-03-29 16:12:49 +0000 |
---|---|---|
committer | Scott Lobdell <slobdell@google.com> | 2021-04-02 22:35:29 +0000 |
commit | 21cdef883cc867db55340b25d5c95e19b12ab383 (patch) | |
tree | 93d1444ebe783f53f5f0ae2647592723b27b3fb8 /core/jni/permission_utils.cpp | |
parent | 7deab3736bb5f3a92be8ac820096926dce2366ad (diff) | |
parent | d1d45f856fdf68835f5b42eacecab44e6dfa8545 (diff) |
Merge SP1A.210329.001
Change-Id: I1e21c5890b5b2e2f2855f09960bc8eec8aa922bf
Diffstat (limited to 'core/jni/permission_utils.cpp')
-rw-r--r-- | core/jni/permission_utils.cpp | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/core/jni/permission_utils.cpp b/core/jni/permission_utils.cpp new file mode 100644 index 000000000000..2b7ef9999491 --- /dev/null +++ b/core/jni/permission_utils.cpp @@ -0,0 +1,71 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "permission_utils.h" +#include "core_jni_helpers.h" + +static struct { + jfieldID fieldUid; // Identity.uid + jfieldID fieldPid; // Identity.pid + jfieldID fieldPackageName; // Identity.packageName + jfieldID fieldAttributionTag; // Identity.attributionTag +} javaIdentityFields; + +static const JNINativeMethod method_table[] = { + // no static methods, currently +}; + +int register_android_media_permission_Identity(JNIEnv* env) { + jclass identityClass = android::FindClassOrDie(env, "android/media/permission/Identity"); + javaIdentityFields.fieldUid = android::GetFieldIDOrDie(env, identityClass, "uid", "I"); + javaIdentityFields.fieldPid = android::GetFieldIDOrDie(env, identityClass, "pid", "I"); + javaIdentityFields.fieldPackageName = + android::GetFieldIDOrDie(env, identityClass, "packageName", "Ljava/lang/String;"); + javaIdentityFields.fieldAttributionTag = + android::GetFieldIDOrDie(env, identityClass, "attributionTag", "Ljava/lang/String;"); + + return android::RegisterMethodsOrDie(env, "android/media/permission/Identity", method_table, + NELEM(method_table)); +} + +namespace android::media::permission { + +Identity convertIdentity(JNIEnv* env, const jobject& jIdentity) { + Identity identity; + + identity.uid = env->GetIntField(jIdentity, javaIdentityFields.fieldUid); + identity.pid = env->GetIntField(jIdentity, javaIdentityFields.fieldPid); + + jstring packageNameStr = static_cast<jstring>( + env->GetObjectField(jIdentity, javaIdentityFields.fieldPackageName)); + if (packageNameStr == nullptr) { + identity.packageName = std::nullopt; + } else { + identity.packageName = std::string(ScopedUtfChars(env, packageNameStr).c_str()); + } + + jstring attributionTagStr = static_cast<jstring>( + env->GetObjectField(jIdentity, javaIdentityFields.fieldAttributionTag)); + if (attributionTagStr == nullptr) { + identity.attributionTag = std::nullopt; + } else { + identity.attributionTag = std::string(ScopedUtfChars(env, attributionTagStr).c_str()); + } + + return identity; +} + +} // namespace android::media::permission |