android_media_MediaMetricsJNI.cpp revision 0e0fee1e3a04023c9ec122d3bd7da54e9565c3e7
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright 2017, The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 17ebf9a0d8a888042c16ec0cb6dd8419f18038663fMike Lockwood#include <android_runtime/AndroidRuntime.h> 18bc7261130a51dc9f3461d3970eee1b923bcbf193Mathias Agopian#include <jni.h> 19bc7261130a51dc9f3461d3970eee1b923bcbf193Mathias Agopian#include <JNIHelp.h> 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 21a90c54c90e1cb668cd74f218370f868763bbd009Wei Wang#include "android_media_MediaMetricsJNI.h" 229748086fe267e21d243a49df1775905094a28dd9Damien Bargiacchi#include <media/MediaAnalyticsItem.h> 239748086fe267e21d243a49df1775905094a28dd9Damien Bargiacchi 249748086fe267e21d243a49df1775905094a28dd9Damien Bargiacchi 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android { 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// place the attributes into a java Bundle object 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// decide whether this is appropriately scoped here. 29b4d5a72691846bce5779cc3db056f09a5031d7ccMathias Agopian// if we do it somewhere else, we have to figure a "give me all the attrs" 30bb94f3107ea567ddf67bed4617c3bcbd602538dfElliott Hughes// access to the inside of MediaAnalyticsItem 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectjobject MediaMetricsJNI::writeMetricsToBundle(JNIEnv* env, MediaAnalyticsItem *item, jobject mybundle) { 32bd9a08d318f94a3d0b2f8f9d7b16b10736d80c5cJason parks 33bd9a08d318f94a3d0b2f8f9d7b16b10736d80c5cJason parks jclass clazzBundle = env->FindClass("android/os/Bundle"); 34b13b9bdad2baf6ad1ec2e56b6b7598fa20f55fc4Mathias Agopian if (clazzBundle==NULL) { 35ac31a3b8b09aba1c5ebc73f0cf65cac2210aa6b7Mathias Agopian ALOGD("can't find android/os/Bundle"); 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // sometimes the caller provides one for us to fill 39a90c54c90e1cb668cd74f218370f868763bbd009Wei Wang if (mybundle == NULL) { 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // create the bundle 41b593842063770f9e75c623a4bc7bb41b4c1830c6Keun-young Park jmethodID constructID = env->GetMethodID(clazzBundle, "<init>", "()V"); 42b593842063770f9e75c623a4bc7bb41b4c1830c6Keun-young Park mybundle = env->NewObject(clazzBundle, constructID); 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mybundle == NULL) { 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 480b722fe9ce98d97dbcb6fefd170b85ab7037e528Jeff Brown // grab methods that we can invoke 498335f1ccccedb6655d96d9d5b697a7f0938235ddMathias Agopian jmethodID setIntID = env->GetMethodID(clazzBundle, "putInt", "(Ljava/lang/String;I)V"); 508335f1ccccedb6655d96d9d5b697a7f0938235ddMathias Agopian jmethodID setLongID = env->GetMethodID(clazzBundle, "putLong", "(Ljava/lang/String;J)V"); 51000479f9e325b4e426a67033abd92d47da412725Mathias Agopian jmethodID setDoubleID = env->GetMethodID(clazzBundle, "putDouble", "(Ljava/lang/String;D)V"); 52cfedceb8c180a2e176154d461659e0c3569dc931Andreas Gampe jmethodID setStringID = env->GetMethodID(clazzBundle, "putString", "(Ljava/lang/String;Ljava/lang/String;)V"); 53cfedceb8c180a2e176154d461659e0c3569dc931Andreas Gampe 54cfedceb8c180a2e176154d461659e0c3569dc931Andreas Gampe // env, class, method, {parms} 55eece0dda56ae29fff6e9003df97594f6ac50b6e2Derek Sollenberger //env->CallVoidMethod(env, mybundle, setIntID, jstr, jint); 568898c16987831db47542a92151ed7209e22268aaMatt Sarett 57eece0dda56ae29fff6e9003df97594f6ac50b6e2Derek Sollenberger // iterate through my attributes 58cfedceb8c180a2e176154d461659e0c3569dc931Andreas Gampe // -- get name, get type, get value 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // -- insert appropriately into the bundle 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (size_t i = 0 ; i < item->mPropCount; i++ ) { 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project MediaAnalyticsItem::Prop *prop = &item->mProps[i]; 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // build the key parameter from prop->mName 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jstring keyName = env->NewStringUTF(prop->mName); 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // invoke the appropriate method to insert 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (prop->mType) { 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case MediaAnalyticsItem::kTypeInt32: 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->CallVoidMethod(mybundle, setIntID, 689748086fe267e21d243a49df1775905094a28dd9Damien Bargiacchi keyName, (jint) prop->u.int32Value); 699748086fe267e21d243a49df1775905094a28dd9Damien Bargiacchi break; 709748086fe267e21d243a49df1775905094a28dd9Damien Bargiacchi case MediaAnalyticsItem::kTypeInt64: 71b593842063770f9e75c623a4bc7bb41b4c1830c6Keun-young Park env->CallVoidMethod(mybundle, setLongID, 72b593842063770f9e75c623a4bc7bb41b4c1830c6Keun-young Park keyName, (jlong) prop->u.int64Value); 73b593842063770f9e75c623a4bc7bb41b4c1830c6Keun-young Park break; 749748086fe267e21d243a49df1775905094a28dd9Damien Bargiacchi case MediaAnalyticsItem::kTypeDouble: 759748086fe267e21d243a49df1775905094a28dd9Damien Bargiacchi env->CallVoidMethod(mybundle, setDoubleID, 769748086fe267e21d243a49df1775905094a28dd9Damien Bargiacchi keyName, (jdouble) prop->u.doubleValue); 770e3d2ab6d2988a1ae70d13d6d77a0f8109eb66e1Damien Bargiacchi break; 780e3d2ab6d2988a1ae70d13d6d77a0f8109eb66e1Damien Bargiacchi case MediaAnalyticsItem::kTypeCString: 799748086fe267e21d243a49df1775905094a28dd9Damien Bargiacchi env->CallVoidMethod(mybundle, setStringID, keyName, 809748086fe267e21d243a49df1775905094a28dd9Damien Bargiacchi env->NewStringUTF(prop->u.CStringValue)); 819748086fe267e21d243a49df1775905094a28dd9Damien Bargiacchi break; 829748086fe267e21d243a49df1775905094a28dd9Damien Bargiacchi default: 839071db1d370573bad80f127898e34066f56c4e64Damien Bargiacchi ALOGE("to_String bad item type: %d for %s", 849676281c4f0b34707e34cf9d2f5a866f1979c405Damien Bargiacchi prop->mType, prop->mName); 859676281c4f0b34707e34cf9d2f5a866f1979c405Damien Bargiacchi break; 860e3d2ab6d2988a1ae70d13d6d77a0f8109eb66e1Damien Bargiacchi } 870e3d2ab6d2988a1ae70d13d6d77a0f8109eb66e1Damien Bargiacchi } 880e3d2ab6d2988a1ae70d13d6d77a0f8109eb66e1Damien Bargiacchi 890e3d2ab6d2988a1ae70d13d6d77a0f8109eb66e1Damien Bargiacchi return mybundle; 900e3d2ab6d2988a1ae70d13d6d77a0f8109eb66e1Damien Bargiacchi} 910e3d2ab6d2988a1ae70d13d6d77a0f8109eb66e1Damien Bargiacchi 920e3d2ab6d2988a1ae70d13d6d77a0f8109eb66e1Damien Bargiacchi}; // namespace android 939748086fe267e21d243a49df1775905094a28dd9Damien Bargiacchi 94afd31e08299008fdc5c2813f21b2573f29dc53dfNarayan Kamath