Android: Generate JNI code for MediaStreamTrack

Bug: webrtc:8278
Change-Id: Id5ac6ecd4f65bed4ae4b2953ef58ebc390508d21
Reviewed-on: https://webrtc-review.googlesource.com/25963
Reviewed-by: Sami Kalliomäki <sakal@webrtc.org>
Commit-Queue: Magnus Jedvert <magjed@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#20910}
diff --git a/sdk/android/BUILD.gn b/sdk/android/BUILD.gn
index 202b2c0..c7738cc 100644
--- a/sdk/android/BUILD.gn
+++ b/sdk/android/BUILD.gn
@@ -288,6 +288,7 @@
     "api/org/webrtc/IceCandidate.java",
     "api/org/webrtc/MediaConstraints.java",
     "api/org/webrtc/MediaStream.java",
+    "api/org/webrtc/MediaStreamTrack.java",
     "api/org/webrtc/NetworkMonitor.java",
     "api/org/webrtc/NetworkMonitorAutoDetect.java",
     "api/org/webrtc/RTCStats.java",
diff --git a/sdk/android/api/org/webrtc/MediaStreamTrack.java b/sdk/android/api/org/webrtc/MediaStreamTrack.java
index 656d024..b13ea9e 100644
--- a/sdk/android/api/org/webrtc/MediaStreamTrack.java
+++ b/sdk/android/api/org/webrtc/MediaStreamTrack.java
@@ -15,9 +15,31 @@
   /** Tracks MediaStreamTrackInterface.TrackState */
   public enum State { LIVE, ENDED }
 
+  // Must be kept in sync with cricket::MediaType.
   public enum MediaType {
-    MEDIA_TYPE_AUDIO,
-    MEDIA_TYPE_VIDEO,
+    MEDIA_TYPE_AUDIO(0),
+    MEDIA_TYPE_VIDEO(1);
+
+    private final int nativeIndex;
+
+    private MediaType(int nativeIndex) {
+      this.nativeIndex = nativeIndex;
+    }
+
+    @CalledByNative("MediaType")
+    int getNative() {
+      return nativeIndex;
+    }
+
+    @CalledByNative("MediaType")
+    static MediaType fromNativeIndex(int nativeIndex) {
+      for (MediaType type : MediaType.values()) {
+        if (type.getNative() == nativeIndex) {
+          return type;
+        }
+      }
+      throw new IllegalArgumentException("Unknown native media type: " + nativeIndex);
+    }
   }
 
   final long nativeTrack;
@@ -27,36 +49,36 @@
   }
 
   public String id() {
-    return nativeId(nativeTrack);
+    return getNativeId(nativeTrack);
   }
 
   public String kind() {
-    return nativeKind(nativeTrack);
+    return getNativeKind(nativeTrack);
   }
 
   public boolean enabled() {
-    return nativeEnabled(nativeTrack);
+    return getNativeEnabled(nativeTrack);
   }
 
   public boolean setEnabled(boolean enable) {
-    return nativeSetEnabled(nativeTrack, enable);
+    return setNativeEnabled(nativeTrack, enable);
   }
 
   public State state() {
-    return nativeState(nativeTrack);
+    return getNativeState(nativeTrack);
   }
 
   public void dispose() {
     JniCommon.nativeReleaseRef(nativeTrack);
   }
 
-  private static native String nativeId(long nativeTrack);
+  private static native String getNativeId(long nativeTrack);
 
-  private static native String nativeKind(long nativeTrack);
+  private static native String getNativeKind(long nativeTrack);
 
-  private static native boolean nativeEnabled(long nativeTrack);
+  private static native boolean getNativeEnabled(long nativeTrack);
 
-  private static native boolean nativeSetEnabled(long nativeTrack, boolean enabled);
+  private static native boolean setNativeEnabled(long nativeTrack, boolean enabled);
 
-  private static native State nativeState(long nativeTrack);
+  private static native State getNativeState(long nativeTrack);
 }
diff --git a/sdk/android/src/jni/classreferenceholder.cc b/sdk/android/src/jni/classreferenceholder.cc
index 50d45ed..a175a0f 100644
--- a/sdk/android/src/jni/classreferenceholder.cc
+++ b/sdk/android/src/jni/classreferenceholder.cc
@@ -75,9 +75,6 @@
   LoadClass(jni, "org/webrtc/MediaCodecVideoEncoder$OutputBufferInfo");
   LoadClass(jni, "org/webrtc/MediaCodecVideoEncoder$VideoCodecType");
   LoadClass(jni, "org/webrtc/MediaSource$State");
-  LoadClass(jni, "org/webrtc/MediaStreamTrack");
-  LoadClass(jni, "org/webrtc/MediaStreamTrack$MediaType");
-  LoadClass(jni, "org/webrtc/MediaStreamTrack$State");
   LoadClass(jni, "org/webrtc/NetworkMonitor");
   LoadClass(jni, "org/webrtc/NetworkMonitorAutoDetect$ConnectionType");
   LoadClass(jni, "org/webrtc/NetworkMonitorAutoDetect$IPAddress");
diff --git a/sdk/android/src/jni/pc/java_native_conversion.cc b/sdk/android/src/jni/pc/java_native_conversion.cc
index ca9bbfb..ee4640b1 100644
--- a/sdk/android/src/jni/pc/java_native_conversion.cc
+++ b/sdk/android/src/jni/pc/java_native_conversion.cc
@@ -14,6 +14,7 @@
 
 #include "pc/webrtcsdp.h"
 #include "sdk/android/generated_peerconnection_jni/jni/IceCandidate_jni.h"
+#include "sdk/android/generated_peerconnection_jni/jni/MediaStreamTrack_jni.h"
 #include "sdk/android/src/jni/classreferenceholder.h"
 
 namespace webrtc {
@@ -35,42 +36,12 @@
 }  // namespace
 
 jobject NativeToJavaMediaType(JNIEnv* jni, cricket::MediaType media_type) {
-  jclass j_media_type_class =
-      FindClass(jni, "org/webrtc/MediaStreamTrack$MediaType");
-
-  const char* media_type_str = nullptr;
-  switch (media_type) {
-    case cricket::MEDIA_TYPE_AUDIO:
-      media_type_str = "MEDIA_TYPE_AUDIO";
-      break;
-    case cricket::MEDIA_TYPE_VIDEO:
-      media_type_str = "MEDIA_TYPE_VIDEO";
-      break;
-    case cricket::MEDIA_TYPE_DATA:
-      RTC_NOTREACHED();
-      break;
-  }
-  jfieldID j_media_type_fid =
-      GetStaticFieldID(jni, j_media_type_class, media_type_str,
-                       "Lorg/webrtc/MediaStreamTrack$MediaType;");
-  return GetStaticObjectField(jni, j_media_type_class, j_media_type_fid);
+  return Java_MediaType_fromNativeIndex(jni, media_type);
 }
 
 cricket::MediaType JavaToNativeMediaType(JNIEnv* jni, jobject j_media_type) {
-  jclass j_media_type_class =
-      FindClass(jni, "org/webrtc/MediaStreamTrack$MediaType");
-  jmethodID j_name_id =
-      GetMethodID(jni, j_media_type_class, "name", "()Ljava/lang/String;");
-  jstring j_type_string =
-      (jstring)jni->CallObjectMethod(j_media_type, j_name_id);
-  CHECK_EXCEPTION(jni) << "error during CallObjectMethod";
-  std::string type_string = JavaToStdString(jni, j_type_string);
-
-  RTC_DCHECK(type_string == "MEDIA_TYPE_AUDIO" ||
-             type_string == "MEDIA_TYPE_VIDEO")
-      << "Media type: " << type_string;
-  return type_string == "MEDIA_TYPE_AUDIO" ? cricket::MEDIA_TYPE_AUDIO
-                                           : cricket::MEDIA_TYPE_VIDEO;
+  return static_cast<cricket::MediaType>(
+      Java_MediaType_getNative(jni, j_media_type));
 }
 
 cricket::Candidate JavaToNativeCandidate(JNIEnv* jni, jobject j_candidate) {
diff --git a/sdk/android/src/jni/pc/mediastreamtrack_jni.cc b/sdk/android/src/jni/pc/mediastreamtrack_jni.cc
index f570881..0983bba 100644
--- a/sdk/android/src/jni/pc/mediastreamtrack_jni.cc
+++ b/sdk/android/src/jni/pc/mediastreamtrack_jni.cc
@@ -15,7 +15,7 @@
 namespace jni {
 
 JNI_FUNCTION_DECLARATION(jstring,
-                         MediaStreamTrack_nativeId,
+                         MediaStreamTrack_getNativeId,
                          JNIEnv* jni,
                          jclass,
                          jlong j_p) {
@@ -24,7 +24,7 @@
 }
 
 JNI_FUNCTION_DECLARATION(jstring,
-                         MediaStreamTrack_nativeKind,
+                         MediaStreamTrack_getNativeKind,
                          JNIEnv* jni,
                          jclass,
                          jlong j_p) {
@@ -33,7 +33,7 @@
 }
 
 JNI_FUNCTION_DECLARATION(jboolean,
-                         MediaStreamTrack_nativeEnabled,
+                         MediaStreamTrack_getNativeEnabled,
                          JNIEnv* jni,
                          jclass,
                          jlong j_p) {
@@ -41,7 +41,7 @@
 }
 
 JNI_FUNCTION_DECLARATION(jobject,
-                         MediaStreamTrack_nativeState,
+                         MediaStreamTrack_getNativeState,
                          JNIEnv* jni,
                          jclass,
                          jlong j_p) {
@@ -51,7 +51,7 @@
 }
 
 JNI_FUNCTION_DECLARATION(jboolean,
-                         MediaStreamTrack_nativeSetEnabled,
+                         MediaStreamTrack_setNativeEnabled,
                          JNIEnv* jni,
                          jclass,
                          jlong j_p,