A first pass to correctly convert between c char strings to Java Strings.

This commit is contained in:
Adam Murdoch
2012-09-09 10:01:53 +10:00
parent 182efebb40
commit b8d0830d44
6 changed files with 89 additions and 11 deletions

View File

@@ -14,6 +14,7 @@
#include <sys/utsname.h>
#include <xlocale.h>
#include <locale.h>
#include <string.h>
/*
* Marks the given result as failed, using the current value of errno
@@ -22,6 +23,24 @@ void mark_failed_with_errno(JNIEnv *env, const char* message, jobject result) {
mark_failed_with_code(env, message, errno, result);
}
char_str* java_to_char_str(JNIEnv *env, jstring string, jobject result) {
return NULL;
}
void char_str_free(char_str* str) {
}
jstring char_to_java(JNIEnv* env, const char* chars, jobject result) {
size_t len = strlen(chars);
jbyteArray byteArray = env->NewByteArray(len);
jbyte* bytes = env->GetByteArrayElements(byteArray, NULL);
memcpy(bytes, chars, len);
env->ReleaseByteArrayElements(byteArray, bytes, JNI_COMMIT);
jclass strClass = env->FindClass("java/lang/String");
jmethodID method = env->GetMethodID(strClass, "<init>", "([B)V");
return (jstring)env->NewObject(strClass, method, byteArray);
}
JNIEXPORT void JNICALL
Java_net_rubygrapefruit_platform_internal_jni_NativeLibraryFunctions_getSystemInfo(JNIEnv *env, jclass target, jobject info, jobject result) {
jclass infoClass = env->GetObjectClass(info);
@@ -44,11 +63,11 @@ Java_net_rubygrapefruit_platform_internal_jni_NativeLibraryFunctions_getSystemIn
}
jfieldID osNameField = env->GetFieldID(infoClass, "osName", "Ljava/lang/String;");
env->SetObjectField(info, osNameField, env->NewStringUTF(machine_info.sysname));
env->SetObjectField(info, osNameField, char_to_java(env, machine_info.sysname, result));
jfieldID osVersionField = env->GetFieldID(infoClass, "osVersion", "Ljava/lang/String;");
env->SetObjectField(info, osVersionField, env->NewStringUTF(machine_info.release));
env->SetObjectField(info, osVersionField, char_to_java(env, machine_info.release, result));
jfieldID machineArchitectureField = env->GetFieldID(infoClass, "machineArchitecture", "Ljava/lang/String;");
env->SetObjectField(info, machineArchitectureField, env->NewStringUTF(machine_info.machine));
env->SetObjectField(info, machineArchitectureField, char_to_java(env, machine_info.machine, result));
}
/*
@@ -247,7 +266,7 @@ Java_net_rubygrapefruit_platform_internal_jni_TerminfoFunctions_initTerminal(JNI
jclass destClass = env->GetObjectClass(capabilities);
jfieldID field = env->GetFieldID(destClass, "terminalName", "Ljava/lang/String;");
jstring jtermType = env->NewStringUTF(termType);
jstring jtermType = char_to_java(env, termType, result);
env->SetObjectField(capabilities, field, jtermType);
// Text attributes