Skip to content

Commit e002457

Browse files
Jean-Baptiste Queruandroid code review
authored andcommitted
Merge "Release JNI local references as soon as possible."
2 parents a3db529 + 057b086 commit e002457

File tree

2 files changed

+59
-49
lines changed

2 files changed

+59
-49
lines changed

drm/jni/Android.mk

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,8 @@ LOCAL_C_INCLUDES += \
3535
$(JNI_H_INCLUDE) \
3636
$(TOP)/frameworks/av/drm/libdrmframework/include \
3737
$(TOP)/frameworks/av/drm/libdrmframework/plugins/common/include \
38-
$(TOP)/frameworks/av/include
38+
$(TOP)/frameworks/av/include \
39+
$(TOP)/libcore/include
3940

4041

4142

drm/jni/android_drm_DrmManagerClient.cpp

Lines changed: 57 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
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

Comments
 (0)