RosettaCodeData/Task/Call-a-foreign-language-fun.../Java/call-a-foreign-language-fun...

44 lines
1.0 KiB
Java

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