code: #include "string.h"
  #include "JNIDemo.h"
  
  void throwByName(JNIEnv* env, const char* className, const char* msg)
  {
    jclass exceptionClass = (*env)->FindClass(env, className);
    if (exceptionClass != NULL)
    {
      (*env)->ThrowNew(env, exceptionClass, msg);
      (*env)->DeleteLocalRef(env, exceptionClass);
    }
    return;
  }
  
  JNIEXPORT jstring JNICALL Java_JNIDemo_callStrdup(JNIEnv *env, jclass cls, jstring s)
  {
    const jbyte* utf8String;
    char* dupe;
    jstring dupeString;
  
    if (s == NULL)
    {
      throwByName(env, "java/lang/NullPointerException", "String is null");
      return NULL;
    }
  
    // Convert from UTF-16 to UTF-8 (C-style)
    utf8String = (*env)->GetStringUTFChars(env, s, NULL);
  
    // Duplicate
    dupe = strdup(utf8String);
  
    // Free the UTF-8 string back to the JVM
    (*env)->ReleaseStringUTFChars(env, s, utf8String);
  
    // Convert the duplicate string from strdup to a Java String
    dupeString = (*env)->NewStringUTF(env, dupe);
  
    // Free the duplicate c-string back to the C runtime heap
    free(dupe);
  
    return dupeString;
  }
  