Moving native MIDI JNI init to AndroidRuntime.cpp.

Remove (non-working) lazy init in midi.cpp

Bug: 79464070
Test: Verify function with NativeMidiTestbed app.
Change-Id: I30182d19d205b4ab952d622824f1a63ab1fef72e
diff --git a/media/native/midi/midi.cpp b/media/native/midi/midi.cpp
index a9b498f..78ca0ab 100644
--- a/media/native/midi/midi.cpp
+++ b/media/native/midi/midi.cpp
@@ -87,37 +87,20 @@
 #define AMIDI_PACKET_OVERHEAD   9
 #define AMIDI_BUFFER_SIZE       (AMIDI_PACKET_SIZE - AMIDI_PACKET_OVERHEAD)
 
+// JNI IDs (see android_media_midi.cpp)
+namespace android { namespace midi {
 //  MidiDevice Fields
-static jobject deviceClassGlobalRef = nullptr;     // A GlobalRef for MidiDevice Class
-static jfieldID fidDeviceClosed = nullptr;         // MidiDevice.mIsDeviceClosed
-static jfieldID fidNativeHandle = nullptr;         // MidiDevice.mNativeHandle
-static jfieldID fidDeviceServerBinder = nullptr;   // MidiDevice.mDeviceServerBinder
-static jfieldID fidDeviceInfo = nullptr;           // MidiDevice.mDeviceInfo
+extern jfieldID gFidMidiNativeHandle;         // MidiDevice.mNativeHandle
+extern jfieldID gFidMidiDeviceServerBinder;   // MidiDevice.mDeviceServerBinder
+extern jfieldID gFidMidiDeviceInfo;           // MidiDevice.mDeviceInfo
 
 //  MidiDeviceInfo Fields
-static jobject deviceInfoClassGlobalRef = nullptr; // A GlobalRef for MidiDeviceInfoClass
-static jfieldID fidDeviceId = nullptr;             // MidiDeviceInfo.mId
+extern jfieldID mFidMidiDeviceId;             // MidiDeviceInfo.mId
+}}
+using namespace android::midi;
 
 static std::mutex openMutex; // Ensure that the device can be connected just once to 1 thread
 
-static void AMIDI_initJNI(JNIEnv *env) {
-    jclass deviceClass = android::FindClassOrDie(env, "android/media/midi/MidiDevice");
-    deviceClassGlobalRef = env->NewGlobalRef(deviceClass);
-
-    // MidiDevice Field IDs
-    fidDeviceClosed = android::GetFieldIDOrDie(env, deviceClass, "mIsDeviceClosed", "Z");
-    fidNativeHandle = android::GetFieldIDOrDie(env, deviceClass, "mNativeHandle", "J");
-    fidDeviceServerBinder = android::GetFieldIDOrDie(env, deviceClass,
-            "mDeviceServerBinder", "Landroid/os/IBinder;");
-    fidDeviceInfo = android::GetFieldIDOrDie(env, deviceClass,
-            "mDeviceInfo", "Landroid/media/midi/MidiDeviceInfo;");
-
-    // MidiDeviceInfo Field IDs
-    jclass deviceInfoClass = android::FindClassOrDie(env, "android/media/midi/MidiDeviceInfo");
-    deviceInfoClassGlobalRef = env->NewGlobalRef(deviceInfoClass);
-    fidDeviceId = android::GetFieldIDOrDie(env, deviceInfoClass, "mId", "I");
-}
-
 //// Handy debugging function.
 //static void AMIDI_logBuffer(const uint8_t *data, size_t numBytes) {
 //    for (size_t index = 0; index < numBytes; index++) {
@@ -162,10 +145,6 @@
 media_status_t AMIDI_API AMidiDevice_fromJava(JNIEnv *env, jobject j_midiDeviceObj,
         AMidiDevice** devicePtrPtr)
 {
-    // Ensures JNI initialization is performed just once.
-    static std::once_flag initCallFlag;
-    std::call_once(initCallFlag, AMIDI_initJNI, env);
-
     if (j_midiDeviceObj == nullptr) {
         ALOGE("AMidiDevice_fromJava() invalid MidiDevice object.");
         return AMEDIA_ERROR_INVALID_OBJECT;
@@ -174,13 +153,13 @@
     {
         std::lock_guard<std::mutex> guard(openMutex);
 
-        long handle = env->GetLongField(j_midiDeviceObj, fidNativeHandle);
+        long handle = env->GetLongField(j_midiDeviceObj, gFidMidiNativeHandle);
         if (handle != 0) {
             // Already opened by someone.
             return AMEDIA_ERROR_INVALID_OBJECT;
         }
 
-        jobject serverBinderObj = env->GetObjectField(j_midiDeviceObj, fidDeviceServerBinder);
+        jobject serverBinderObj = env->GetObjectField(j_midiDeviceObj, gFidMidiDeviceServerBinder);
         sp<IBinder> serverBinder = android::ibinderForJavaObject(env, serverBinderObj);
         if (serverBinder.get() == nullptr) {
             ALOGE("AMidiDevice_fromJava couldn't connect to native MIDI server.");
@@ -190,11 +169,11 @@
         // don't check allocation failures, just abort..
         AMidiDevice* devicePtr = new AMidiDevice;
         devicePtr->server = new BpMidiDeviceServer(serverBinder);
-        jobject midiDeviceInfoObj = env->GetObjectField(j_midiDeviceObj, fidDeviceInfo);
-        devicePtr->deviceId = env->GetIntField(midiDeviceInfoObj, fidDeviceId);
+        jobject midiDeviceInfoObj = env->GetObjectField(j_midiDeviceObj, gFidMidiDeviceInfo);
+        devicePtr->deviceId = env->GetIntField(midiDeviceInfoObj, mFidMidiDeviceId);
 
         // Synchronize with the associated Java MidiDevice.
-        env->SetLongField(j_midiDeviceObj, fidNativeHandle, (long)devicePtr);
+        env->SetLongField(j_midiDeviceObj, gFidMidiNativeHandle, (long)devicePtr);
         env->GetJavaVM(&devicePtr->javaVM);
         devicePtr->midiDeviceObj = env->NewGlobalRef(j_midiDeviceObj);
 
@@ -220,17 +199,16 @@
     LOG_ALWAYS_FATAL_IF(err != JNI_OK, "AMidiDevice_release Error accessing JNIEnv err:%d", err);
 
     // Synchronize with the associated Java MidiDevice.
-    // env->CallVoidMethod(j_midiDeviceObj, midClearNativeHandle);
     {
         std::lock_guard<std::mutex> guard(openMutex);
-        long handle = env->GetLongField(device->midiDeviceObj, fidNativeHandle);
+        long handle = env->GetLongField(device->midiDeviceObj, gFidMidiNativeHandle);
         if (handle == 0) {
             // Not opened as native.
             ALOGE("AMidiDevice_release() device not opened in native client.");
             return AMEDIA_ERROR_INVALID_OBJECT;
         }
 
-        env->SetLongField(device->midiDeviceObj, fidNativeHandle, 0L);
+        env->SetLongField(device->midiDeviceObj, gFidMidiNativeHandle, 0L);
     }
     env->DeleteGlobalRef(device->midiDeviceObj);