android_jni: Add a function to get version string

Returns the libavif version, codecs string and libyuv version (if
available).

GOOGLE_INTERNAL_CL: 525830047
diff --git a/android_jni/avifandroidjni/src/androidTest/java/org/aomedia/avif/android/AnimatedImageTest.java b/android_jni/avifandroidjni/src/androidTest/java/org/aomedia/avif/android/AnimatedImageTest.java
index 20e1c23..5c98eb2 100644
--- a/android_jni/avifandroidjni/src/androidTest/java/org/aomedia/avif/android/AnimatedImageTest.java
+++ b/android_jni/avifandroidjni/src/androidTest/java/org/aomedia/avif/android/AnimatedImageTest.java
@@ -131,9 +131,11 @@
   }
 
   @Test
-  public void testResultToString() throws IOException {
+  public void testUtilityFunctions() throws IOException {
     // Test the avifResult value whose value and string representations are least likely to change.
     assertThat(AvifDecoder.resultToString(AVIF_RESULT_OK)).isEqualTo("OK");
+    // Ensure that the version string starts with "libavif".
+    assertThat(AvifDecoder.versionString()).startsWith("libavif");
   }
 
   private ByteBuffer getBuffer() throws IOException {
diff --git a/android_jni/avifandroidjni/src/main/java/org/aomedia/avif/android/AvifDecoder.java b/android_jni/avifandroidjni/src/main/java/org/aomedia/avif/android/AvifDecoder.java
index 09caebf..773720a 100644
--- a/android_jni/avifandroidjni/src/main/java/org/aomedia/avif/android/AvifDecoder.java
+++ b/android_jni/avifandroidjni/src/main/java/org/aomedia/avif/android/AvifDecoder.java
@@ -245,6 +245,12 @@
    */
   public static native String resultToString(int result);
 
+  /**
+   * Returns a String that contains information about the libavif version, underlying codecs and
+   * libyuv version (if available).
+   */
+  public static native String versionString();
+
   private native long createDecoder(ByteBuffer encoded, int length, int threads);
 
   private native void destroyDecoder(long decoder);
diff --git a/android_jni/avifandroidjni/src/main/jni/libavif_jni.cc b/android_jni/avifandroidjni/src/main/jni/libavif_jni.cc
index bbbffc6..16bba1a 100644
--- a/android_jni/avifandroidjni/src/main/jni/libavif_jni.cc
+++ b/android_jni/avifandroidjni/src/main/jni/libavif_jni.cc
@@ -6,6 +6,7 @@
 #include <cpu-features.h>
 #include <jni.h>
 
+#include <cstdio>
 #include <memory>
 #include <new>
 
@@ -295,6 +296,16 @@
   return env->NewStringUTF(avifResultToString(static_cast<avifResult>(result)));
 }
 
+FUNC(jstring, versionString) {
+  char codec_versions[256];
+  avifCodecVersions(codec_versions);
+  char version_string[512];
+  snprintf(version_string, sizeof(version_string),
+           "libavif: %s. Codecs: %s. libyuv: %d.", avifVersion(),
+           codec_versions, avifLibYUVVersion());
+  return env->NewStringUTF(version_string);
+}
+
 FUNC(void, destroyDecoder, jlong jdecoder) {
   AvifDecoderWrapper* const decoder =
       reinterpret_cast<AvifDecoderWrapper*>(jdecoder);