2020
2121#include < jni.h>
2222#include < JNIHelp.h>
23+ #include < ScopedLocalRef.h>
2324#include < android_runtime/AndroidRuntime.h>
2425
2526#include < drm/DrmInfo.h>
@@ -250,35 +251,37 @@ static jobject android_drm_DrmManagerClient_getConstraintsFromContent(
250251 = getDrmManagerClientImpl (env, thiz)->getConstraints (uniqueId, &pathString, usage);
251252
252253 jclass localRef = env->FindClass (" android/content/ContentValues" );
254+ jmethodID ContentValues_putByteArray =
255+ env->GetMethodID (localRef, " put" , " (Ljava/lang/String;[B)V" );
256+ jmethodID ContentValues_putString =
257+ env->GetMethodID (localRef, " put" , " (Ljava/lang/String;Ljava/lang/String;)V" );
258+ jmethodID ContentValues_constructor = env->GetMethodID (localRef, " <init>" , " ()V" );
253259 jobject constraints = NULL ;
254260
255261 if (NULL != localRef && NULL != pConstraints) {
256- // Get the constructor id
257- jmethodID constructorId = env->GetMethodID (localRef, " <init>" , " ()V" );
258262 // create the java DrmConstraints object
259- constraints = env->NewObject (localRef, constructorId );
263+ constraints = env->NewObject (localRef, ContentValues_constructor );
260264
261265 DrmConstraints::KeyIterator keyIt = pConstraints->keyIterator ();
262-
263266 while (keyIt.hasNext ()) {
264267 String8 key = keyIt.next ();
265268
266269 // insert the entry<constraintKey, constraintValue> to newly created java object
267270 if (DrmConstraints::EXTENDED_METADATA == key) {
268271 const char * value = pConstraints->getAsByteArray (&key);
269272 if (NULL != value) {
270- jbyteArray dataArray = env->NewByteArray (strlen (value));
271- env-> SetByteArrayRegion (dataArray, 0 , strlen (value), (jbyte*)value );
272- env->CallVoidMethod (
273- constraints, env->GetMethodID (localRef, " put " , " (Ljava/lang/String;[B)V " ) ,
274- env-> NewStringUTF (key. string ()) , dataArray);
273+ ScopedLocalRef< jbyteArray> dataArray (env, env->NewByteArray (strlen (value) ));
274+ ScopedLocalRef<jstring> keyString (env, env-> NewStringUTF (key. string ()) );
275+ env->SetByteArrayRegion (dataArray. get (), 0 , strlen (value), (jbyte*)value);
276+ env->CallVoidMethod (constraints, ContentValues_putByteArray ,
277+ keyString. get () , dataArray. get () );
275278 }
276279 } else {
277280 String8 value = pConstraints->get (key);
278- env-> CallVoidMethod (
279- constraints,
280- env->GetMethodID (localRef, " put " , " (Ljava/lang/String;Ljava/lang/String;)V " ) ,
281- env-> NewStringUTF (key. string ()), env-> NewStringUTF (value. string () ));
281+ ScopedLocalRef<jstring> keyString ( env, env-> NewStringUTF (key. string ()));
282+ ScopedLocalRef<jstring> valueString (env, env-> NewStringUTF (value. string ()));
283+ env->CallVoidMethod (constraints, ContentValues_putString ,
284+ keyString. get (), valueString. get ( ));
282285 }
283286 }
284287 }
@@ -297,8 +300,10 @@ static jobject android_drm_DrmManagerClient_getMetadataFromContent(
297300
298301 jobject metadata = NULL ;
299302
300- jclass localRef = NULL ;
301- localRef = env->FindClass (" android/content/ContentValues" );
303+ jclass localRef = env->FindClass (" android/content/ContentValues" );
304+ jmethodID ContentValues_putString =
305+ env->GetMethodID (localRef, " put" , " (Ljava/lang/String;Ljava/lang/String;)V" );
306+
302307 if (NULL != localRef && NULL != pMetadata) {
303308 // Get the constructor id
304309 jmethodID constructorId = NULL ;
@@ -313,9 +318,10 @@ static jobject android_drm_DrmManagerClient_getMetadataFromContent(
313318 // insert the entry<constraintKey, constraintValue>
314319 // to newly created java object
315320 String8 value = pMetadata->get (key);
316- env->CallVoidMethod (metadata, env->GetMethodID (localRef, " put" ,
317- " (Ljava/lang/String;Ljava/lang/String;)V" ),
318- env->NewStringUTF (key.string ()), env->NewStringUTF (value.string ()));
321+ ScopedLocalRef<jstring> keyString (env, env->NewStringUTF (key.string ()));
322+ ScopedLocalRef<jstring> valueString (env, env->NewStringUTF (value.string ()));
323+ env->CallVoidMethod (metadata, ContentValues_putString,
324+ keyString.get (), valueString.get ());
319325 }
320326 }
321327 }
@@ -426,29 +432,30 @@ static jobject android_drm_DrmManagerClient_processDrmInfo(
426432 DrmInfo drmInfo (mInfoType , buffer, mMimeType );
427433
428434 jclass clazz = env->FindClass (" android/drm/DrmInfo" );
435+ jmethodID DrmInfo_get = env->GetMethodID (clazz, " get" , " (Ljava/lang/String;)Ljava/lang/Object;" );
429436 jobject keyIterator
430437 = env->CallObjectMethod (drmInfoObject,
431438 env->GetMethodID (clazz, " keyIterator" , " ()Ljava/util/Iterator;" ));
432439
433- jmethodID hasNextId = env->GetMethodID (env-> FindClass (" java/util/Iterator" ), " hasNext " , " ()Z " );
434-
435- while ( env->CallBooleanMethod (keyIterator, hasNextId)) {
436- jstring key = (jstring) env-> CallObjectMethod (keyIterator,
437- env->GetMethodID (env-> FindClass (" java/util/Iterator " ),
438- " next " , " ()Ljava/lang/Object; " ) );
439-
440- jobject valueObject = env->CallObjectMethod (drmInfoObject,
441- env-> GetMethodID (clazz, " get " , " (Ljava/lang/String;)Ljava/lang/Object; " ), key);
442-
443- jstring valString = NULL ;
444- if ( NULL != valueObject) {
445- valString = (jstring) env-> CallObjectMethod (valueObject,
446- env-> GetMethodID (env-> FindClass ( " java/lang/Object " ),
447- " toString " , " ()Ljava/lang/String; " ));
440+ jclass Iterator_class = env->FindClass (" java/util/Iterator" );
441+ jmethodID Iterator_hasNext = env-> GetMethodID (Iterator_class, " hasNext " , " ()Z " );
442+ jmethodID Iterator_next = env->GetMethodID (Iterator_class, " next " , " ()Ljava/lang/Object; " );
443+
444+ jclass Object_class = env->FindClass (" java/lang/Object " );
445+ jmethodID Object_toString = env-> GetMethodID (Object_class, " toString " , " ()Ljava/lang/String; " );
446+
447+ while ( env->CallBooleanMethod (keyIterator, Iterator_hasNext)) {
448+ ScopedLocalRef<jstring> key (env,
449+ (jstring) env-> CallObjectMethod (keyIterator, Iterator_next));
450+ ScopedLocalRef<jobject> valueObject (env,
451+ env-> CallObjectMethod (drmInfoObject, DrmInfo_get, key. get ()));
452+ ScopedLocalRef<jstring> valString ( env, NULL );
453+ if ( NULL != valueObject. get ()) {
454+ valString. reset ((jstring) env-> CallObjectMethod (valueObject. get (), Object_toString ));
448455 }
449456
450- String8 keyString = Utility::getStringValue (env, key);
451- String8 valueString = Utility::getStringValue (env, valString);
457+ String8 keyString = Utility::getStringValue (env, key. get () );
458+ String8 valueString = Utility::getStringValue (env, valString. get () );
452459 ALOGV (" Key: %s | Value: %s" , keyString.string (), valueString.string ());
453460
454461 drmInfo.put (keyString, valueString);
@@ -508,20 +515,21 @@ static jobject android_drm_DrmManagerClient_acquireDrmInfo(
508515 jobject keyIterator
509516 = env->CallObjectMethod (drmInfoRequest,
510517 env->GetMethodID (clazz, " keyIterator" , " ()Ljava/util/Iterator;" ));
518+ jmethodID DrmInfoRequest_get = env->GetMethodID (clazz,
519+ " get" , " (Ljava/lang/String;)Ljava/lang/Object;" );
511520
512- jmethodID hasNextId = env->GetMethodID (env->FindClass (" java/util/Iterator" ), " hasNext" , " ()Z" );
521+ jclass Iterator_class = env->FindClass (" java/util/Iterator" );
522+ jmethodID Iterator_hasNext = env->GetMethodID (Iterator_class, " hasNext" , " ()Z" );
523+ jmethodID Iterator_next = env->GetMethodID (Iterator_class, " next" , " ()Ljava/lang/Object;" );
513524
514- while (env->CallBooleanMethod (keyIterator, hasNextId )) {
515- jstring key
516- = (jstring) env->CallObjectMethod (keyIterator,
517- env-> GetMethodID (env-> FindClass ( " java/util/Iterator " ) ,
518- " next " , " ()Ljava/lang/Object; " ));
525+ while (env->CallBooleanMethod (keyIterator, Iterator_hasNext )) {
526+ ScopedLocalRef< jstring> key (env,
527+ (jstring) env->CallObjectMethod (keyIterator, Iterator_next));
528+ ScopedLocalRef<jstring> value (env,
529+ (jstring) env-> CallObjectMethod (drmInfoRequest, DrmInfoRequest_get, key. get () ));
519530
520- jstring value = (jstring) env->CallObjectMethod (drmInfoRequest,
521- env->GetMethodID (clazz, " get" , " (Ljava/lang/String;)Ljava/lang/Object;" ), key);
522-
523- String8 keyString = Utility::getStringValue (env, key);
524- String8 valueString = Utility::getStringValue (env, value);
531+ String8 keyString = Utility::getStringValue (env, key.get ());
532+ String8 valueString = Utility::getStringValue (env, value.get ());
525533 ALOGV (" Key: %s | Value: %s" , keyString.string (), valueString.string ());
526534
527535 drmInfoReq.put (keyString, valueString);
@@ -552,9 +560,10 @@ static jobject android_drm_DrmManagerClient_acquireDrmInfo(
552560 while (it.hasNext ()) {
553561 String8 key = it.next ();
554562 String8 value = pDrmInfo->get (key);
555-
563+ ScopedLocalRef<jstring> keyString (env, env->NewStringUTF (key.string ()));
564+ ScopedLocalRef<jstring> valueString (env, env->NewStringUTF (value.string ()));
556565 env->CallVoidMethod (drmInfoObject, putMethodId,
557- env-> NewStringUTF (key. string ()), env-> NewStringUTF (value. string () ));
566+ keyString. get (), valueString. get ( ));
558567 }
559568 }
560569 delete [] pDrmInfo->getData ().data ;
0 commit comments