Fix warning about recursive loading of libmedia_jni.so
JNI register methods were resolving classes to initialize fieldID's
and methodID's for native JNI use. Those classes may have static
initializers which call System.loadLibrary("libmedia_jni.so"), but the
library is already in the process of being loaded.
Bug: 180829511
Test: TH
Test: boot blueline observe no output from "adb logcat -d | grep recursive"
Change-Id: I47d40bc06457a9550bd5855f6f8d031ddc465b47
diff --git a/media/jni/android_media_JetPlayer.cpp b/media/jni/android_media_JetPlayer.cpp
index 481f80b..10a5b58 100644
--- a/media/jni/android_media_JetPlayer.cpp
+++ b/media/jni/android_media_JetPlayer.cpp
@@ -43,12 +43,34 @@
jfieldID nativePlayerInJavaObj; // stores in Java the native JetPlayer object
};
-static fields_t javaJetPlayerFields;
+static fields_t javaJetPlayerFields {};
+#define JAVA_NATIVEJETPLAYERINJAVAOBJ_FIELD_NAME "mNativePlayerInJavaObj"
+#define JAVA_NATIVEJETPOSTEVENT_CALLBACK_NAME "postEventFromNative"
+
+static void initializeJavaIDs(JNIEnv* env) {
+ static std::once_flag sJniInitialized;
+
+ std::call_once(sJniInitialized, [](JNIEnv* env) {
+ // Get the JetPlayer java class
+ jclass jetPlayerClass = FindClassOrDie(env, kClassPathName);
+ javaJetPlayerFields.jetClass = MakeGlobalRefOrDie(env, jetPlayerClass);
+
+ // Get the mNativePlayerInJavaObj variable field
+ javaJetPlayerFields.nativePlayerInJavaObj =
+ GetFieldIDOrDie(env, jetPlayerClass, JAVA_NATIVEJETPLAYERINJAVAOBJ_FIELD_NAME, "J");
+
+ // Get the callback to post events from this native code to Java
+ javaJetPlayerFields.postNativeEventInJava = GetStaticMethodIDOrDie(env,
+ javaJetPlayerFields.jetClass, JAVA_NATIVEJETPOSTEVENT_CALLBACK_NAME,
+ "(Ljava/lang/Object;III)V");
+ }, env);
+}
// ----------------------------------------------------------------------------
// ----------------------------------------------------------------------------
+
/*
* This function is called from JetPlayer instance's render thread
*/
@@ -79,6 +101,8 @@
android_media_JetPlayer_setup(JNIEnv *env, jobject thiz, jobject weak_this,
jint maxTracks, jint trackBufferSize)
{
+ initializeJavaIDs(env);
+
//ALOGV("android_media_JetPlayer_setup(): entering.");
JetPlayer* lpJet = new JetPlayer(env->NewGlobalRef(weak_this), maxTracks, trackBufferSize);
@@ -511,28 +535,9 @@
{"native_clearQueue", "()Z", (void *)android_media_JetPlayer_clearQueue},
};
-#define JAVA_NATIVEJETPLAYERINJAVAOBJ_FIELD_NAME "mNativePlayerInJavaObj"
-#define JAVA_NATIVEJETPOSTEVENT_CALLBACK_NAME "postEventFromNative"
int register_android_media_JetPlayer(JNIEnv *env)
{
- javaJetPlayerFields.jetClass = NULL;
- javaJetPlayerFields.postNativeEventInJava = NULL;
- javaJetPlayerFields.nativePlayerInJavaObj = NULL;
-
- // Get the JetPlayer java class
- jclass jetPlayerClass = FindClassOrDie(env, kClassPathName);
- javaJetPlayerFields.jetClass = MakeGlobalRefOrDie(env, jetPlayerClass);
-
- // Get the mNativePlayerInJavaObj variable field
- javaJetPlayerFields.nativePlayerInJavaObj = GetFieldIDOrDie(env,
- jetPlayerClass, JAVA_NATIVEJETPLAYERINJAVAOBJ_FIELD_NAME, "J");
-
- // Get the callback to post events from this native code to Java
- javaJetPlayerFields.postNativeEventInJava = GetStaticMethodIDOrDie(env,
- javaJetPlayerFields.jetClass, JAVA_NATIVEJETPOSTEVENT_CALLBACK_NAME,
- "(Ljava/lang/Object;III)V");
-
return RegisterMethodsOrDie(env, kClassPathName, gMethods, NELEM(gMethods));
}