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));
 }