44 lines
1.0 KiB
Java
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;
|
|
}
|