|
@@ -41,6 +41,7 @@
|
|
#include "main/input_default.h"
|
|
#include "main/input_default.h"
|
|
#include "main/main.h"
|
|
#include "main/main.h"
|
|
#include "os_android.h"
|
|
#include "os_android.h"
|
|
|
|
+#include "string_android.h"
|
|
#include "thread_jandroid.h"
|
|
#include "thread_jandroid.h"
|
|
#include <unistd.h>
|
|
#include <unistd.h>
|
|
|
|
|
|
@@ -223,7 +224,7 @@ String _get_class_name(JNIEnv *env, jclass cls, bool *array) {
|
|
jboolean isarr = env->CallBooleanMethod(cls, isArray);
|
|
jboolean isarr = env->CallBooleanMethod(cls, isArray);
|
|
(*array) = isarr ? true : false;
|
|
(*array) = isarr ? true : false;
|
|
}
|
|
}
|
|
- String name = env->GetStringUTFChars(clsName, NULL);
|
|
|
|
|
|
+ String name = jstring_to_string(clsName, env);
|
|
env->DeleteLocalRef(clsName);
|
|
env->DeleteLocalRef(clsName);
|
|
|
|
|
|
return name;
|
|
return name;
|
|
@@ -241,7 +242,7 @@ Variant _jobject_to_variant(JNIEnv *env, jobject obj) {
|
|
|
|
|
|
if (name == "java.lang.String") {
|
|
if (name == "java.lang.String") {
|
|
|
|
|
|
- return String::utf8(env->GetStringUTFChars((jstring)obj, NULL));
|
|
|
|
|
|
+ return jstring_to_string((jstring)obj, env);
|
|
};
|
|
};
|
|
|
|
|
|
if (name == "[Ljava.lang.String;") {
|
|
if (name == "[Ljava.lang.String;") {
|
|
@@ -252,7 +253,7 @@ Variant _jobject_to_variant(JNIEnv *env, jobject obj) {
|
|
|
|
|
|
for (int i = 0; i < stringCount; i++) {
|
|
for (int i = 0; i < stringCount; i++) {
|
|
jstring string = (jstring)env->GetObjectArrayElement(arr, i);
|
|
jstring string = (jstring)env->GetObjectArrayElement(arr, i);
|
|
- sarr.push_back(String::utf8(env->GetStringUTFChars(string, NULL)));
|
|
|
|
|
|
+ sarr.push_back(jstring_to_string(string, env));
|
|
env->DeleteLocalRef(string);
|
|
env->DeleteLocalRef(string);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -487,7 +488,7 @@ public:
|
|
case Variant::STRING: {
|
|
case Variant::STRING: {
|
|
|
|
|
|
jobject o = env->CallObjectMethodA(instance, E->get().method, v);
|
|
jobject o = env->CallObjectMethodA(instance, E->get().method, v);
|
|
- ret = String::utf8(env->GetStringUTFChars((jstring)o, NULL));
|
|
|
|
|
|
+ ret = jstring_to_string((jstring)o, env);
|
|
env->DeleteLocalRef(o);
|
|
env->DeleteLocalRef(o);
|
|
} break;
|
|
} break;
|
|
case Variant::POOL_STRING_ARRAY: {
|
|
case Variant::POOL_STRING_ARRAY: {
|
|
@@ -634,20 +635,20 @@ static String _get_user_data_dir() {
|
|
|
|
|
|
JNIEnv *env = ThreadAndroid::get_env();
|
|
JNIEnv *env = ThreadAndroid::get_env();
|
|
jstring s = (jstring)env->CallObjectMethod(godot_io, _getDataDir);
|
|
jstring s = (jstring)env->CallObjectMethod(godot_io, _getDataDir);
|
|
- return String(env->GetStringUTFChars(s, NULL));
|
|
|
|
|
|
+ return jstring_to_string(s, env);
|
|
}
|
|
}
|
|
|
|
|
|
static String _get_locale() {
|
|
static String _get_locale() {
|
|
|
|
|
|
JNIEnv *env = ThreadAndroid::get_env();
|
|
JNIEnv *env = ThreadAndroid::get_env();
|
|
jstring s = (jstring)env->CallObjectMethod(godot_io, _getLocale);
|
|
jstring s = (jstring)env->CallObjectMethod(godot_io, _getLocale);
|
|
- return String(env->GetStringUTFChars(s, NULL));
|
|
|
|
|
|
+ return jstring_to_string(s, env);
|
|
}
|
|
}
|
|
|
|
|
|
static String _get_clipboard() {
|
|
static String _get_clipboard() {
|
|
JNIEnv *env = ThreadAndroid::get_env();
|
|
JNIEnv *env = ThreadAndroid::get_env();
|
|
jstring s = (jstring)env->CallObjectMethod(_godot_instance, _getClipboard);
|
|
jstring s = (jstring)env->CallObjectMethod(_godot_instance, _getClipboard);
|
|
- return String(env->GetStringUTFChars(s, NULL));
|
|
|
|
|
|
+ return jstring_to_string(s, env);
|
|
}
|
|
}
|
|
|
|
|
|
static void _set_clipboard(const String &p_text) {
|
|
static void _set_clipboard(const String &p_text) {
|
|
@@ -661,7 +662,7 @@ static String _get_model() {
|
|
|
|
|
|
JNIEnv *env = ThreadAndroid::get_env();
|
|
JNIEnv *env = ThreadAndroid::get_env();
|
|
jstring s = (jstring)env->CallObjectMethod(godot_io, _getModel);
|
|
jstring s = (jstring)env->CallObjectMethod(godot_io, _getModel);
|
|
- return String(env->GetStringUTFChars(s, NULL));
|
|
|
|
|
|
+ return jstring_to_string(s, env);
|
|
}
|
|
}
|
|
|
|
|
|
static int _get_screen_dpi() {
|
|
static int _get_screen_dpi() {
|
|
@@ -674,7 +675,7 @@ static String _get_unique_id() {
|
|
|
|
|
|
JNIEnv *env = ThreadAndroid::get_env();
|
|
JNIEnv *env = ThreadAndroid::get_env();
|
|
jstring s = (jstring)env->CallObjectMethod(godot_io, _getUniqueID);
|
|
jstring s = (jstring)env->CallObjectMethod(godot_io, _getUniqueID);
|
|
- return String(env->GetStringUTFChars(s, NULL));
|
|
|
|
|
|
+ return jstring_to_string(s, env);
|
|
}
|
|
}
|
|
|
|
|
|
static void _show_vk(const String &p_existing) {
|
|
static void _show_vk(const String &p_existing) {
|
|
@@ -694,7 +695,7 @@ static String _get_system_dir(int p_dir) {
|
|
|
|
|
|
JNIEnv *env = ThreadAndroid::get_env();
|
|
JNIEnv *env = ThreadAndroid::get_env();
|
|
jstring s = (jstring)env->CallObjectMethod(godot_io, _getSystemDir, p_dir);
|
|
jstring s = (jstring)env->CallObjectMethod(godot_io, _getSystemDir, p_dir);
|
|
- return String(env->GetStringUTFChars(s, NULL));
|
|
|
|
|
|
+ return jstring_to_string(s, env);
|
|
}
|
|
}
|
|
|
|
|
|
static int _get_gles_version_code() {
|
|
static int _get_gles_version_code() {
|
|
@@ -891,12 +892,14 @@ JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_setup(JNIEnv *env, jo
|
|
ThreadAndroid::setup_thread();
|
|
ThreadAndroid::setup_thread();
|
|
|
|
|
|
const char **cmdline = NULL;
|
|
const char **cmdline = NULL;
|
|
|
|
+ jstring *j_cmdline = NULL;
|
|
int cmdlen = 0;
|
|
int cmdlen = 0;
|
|
if (p_cmdline) {
|
|
if (p_cmdline) {
|
|
cmdlen = env->GetArrayLength(p_cmdline);
|
|
cmdlen = env->GetArrayLength(p_cmdline);
|
|
if (cmdlen) {
|
|
if (cmdlen) {
|
|
- cmdline = (const char **)malloc((env->GetArrayLength(p_cmdline) + 1) * sizeof(const char *));
|
|
|
|
|
|
+ cmdline = (const char **)malloc((cmdlen + 1) * sizeof(const char *));
|
|
cmdline[cmdlen] = NULL;
|
|
cmdline[cmdlen] = NULL;
|
|
|
|
+ j_cmdline = (jstring *)malloc(cmdlen * sizeof(jstring));
|
|
|
|
|
|
for (int i = 0; i < cmdlen; i++) {
|
|
for (int i = 0; i < cmdlen; i++) {
|
|
|
|
|
|
@@ -904,12 +907,19 @@ JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_setup(JNIEnv *env, jo
|
|
const char *rawString = env->GetStringUTFChars(string, 0);
|
|
const char *rawString = env->GetStringUTFChars(string, 0);
|
|
|
|
|
|
cmdline[i] = rawString;
|
|
cmdline[i] = rawString;
|
|
|
|
+ j_cmdline[i] = string;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
Error err = Main::setup("apk", cmdlen, (char **)cmdline, false);
|
|
Error err = Main::setup("apk", cmdlen, (char **)cmdline, false);
|
|
if (cmdline) {
|
|
if (cmdline) {
|
|
|
|
+ if (j_cmdline) {
|
|
|
|
+ for (int i = 0; i < cmdlen; ++i) {
|
|
|
|
+ env->ReleaseStringUTFChars(j_cmdline[i], cmdline[i]);
|
|
|
|
+ }
|
|
|
|
+ free(j_cmdline);
|
|
|
|
+ }
|
|
free(cmdline);
|
|
free(cmdline);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -1313,7 +1323,7 @@ JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_joyhat(JNIEnv *env, j
|
|
|
|
|
|
JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_joyconnectionchanged(JNIEnv *env, jobject obj, jint p_device, jboolean p_connected, jstring p_name) {
|
|
JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_joyconnectionchanged(JNIEnv *env, jobject obj, jint p_device, jboolean p_connected, jstring p_name) {
|
|
if (os_android) {
|
|
if (os_android) {
|
|
- String name = env->GetStringUTFChars(p_name, NULL);
|
|
|
|
|
|
+ String name = jstring_to_string(p_name, env);
|
|
os_android->joy_connection_changed(p_device, p_connected, name);
|
|
os_android->joy_connection_changed(p_device, p_connected, name);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -1386,7 +1396,7 @@ JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_audio(JNIEnv *env, jo
|
|
|
|
|
|
JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_singleton(JNIEnv *env, jobject obj, jstring name, jobject p_object) {
|
|
JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_singleton(JNIEnv *env, jobject obj, jstring name, jobject p_object) {
|
|
|
|
|
|
- String singname = env->GetStringUTFChars(name, NULL);
|
|
|
|
|
|
+ String singname = jstring_to_string(name, env);
|
|
JNISingleton *s = memnew(JNISingleton);
|
|
JNISingleton *s = memnew(JNISingleton);
|
|
s->set_instance(env->NewGlobalRef(p_object));
|
|
s->set_instance(env->NewGlobalRef(p_object));
|
|
jni_singletons[singname] = s;
|
|
jni_singletons[singname] = s;
|
|
@@ -1463,21 +1473,21 @@ static const char *get_jni_sig(const String &p_type) {
|
|
|
|
|
|
JNIEXPORT jstring JNICALL Java_org_godotengine_godot_GodotLib_getGlobal(JNIEnv *env, jobject obj, jstring path) {
|
|
JNIEXPORT jstring JNICALL Java_org_godotengine_godot_GodotLib_getGlobal(JNIEnv *env, jobject obj, jstring path) {
|
|
|
|
|
|
- String js = env->GetStringUTFChars(path, NULL);
|
|
|
|
|
|
+ String js = jstring_to_string(path, env);
|
|
|
|
|
|
return env->NewStringUTF(ProjectSettings::get_singleton()->get(js).operator String().utf8().get_data());
|
|
return env->NewStringUTF(ProjectSettings::get_singleton()->get(js).operator String().utf8().get_data());
|
|
}
|
|
}
|
|
|
|
|
|
JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_method(JNIEnv *env, jobject obj, jstring sname, jstring name, jstring ret, jobjectArray args) {
|
|
JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_method(JNIEnv *env, jobject obj, jstring sname, jstring name, jstring ret, jobjectArray args) {
|
|
|
|
|
|
- String singname = env->GetStringUTFChars(sname, NULL);
|
|
|
|
|
|
+ String singname = jstring_to_string(sname, env);
|
|
|
|
|
|
ERR_FAIL_COND(!jni_singletons.has(singname));
|
|
ERR_FAIL_COND(!jni_singletons.has(singname));
|
|
|
|
|
|
JNISingleton *s = jni_singletons.get(singname);
|
|
JNISingleton *s = jni_singletons.get(singname);
|
|
|
|
|
|
- String mname = env->GetStringUTFChars(name, NULL);
|
|
|
|
- String retval = env->GetStringUTFChars(ret, NULL);
|
|
|
|
|
|
+ String mname = jstring_to_string(name, env);
|
|
|
|
+ String retval = jstring_to_string(ret, env);
|
|
Vector<Variant::Type> types;
|
|
Vector<Variant::Type> types;
|
|
String cs = "(";
|
|
String cs = "(";
|
|
|
|
|
|
@@ -1486,9 +1496,9 @@ JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_method(JNIEnv *env, j
|
|
for (int i = 0; i < stringCount; i++) {
|
|
for (int i = 0; i < stringCount; i++) {
|
|
|
|
|
|
jstring string = (jstring)env->GetObjectArrayElement(args, i);
|
|
jstring string = (jstring)env->GetObjectArrayElement(args, i);
|
|
- const char *rawString = env->GetStringUTFChars(string, 0);
|
|
|
|
- types.push_back(get_jni_type(String(rawString)));
|
|
|
|
- cs += get_jni_sig(String(rawString));
|
|
|
|
|
|
+ const String rawString = jstring_to_string(string, env);
|
|
|
|
+ types.push_back(get_jni_type(rawString));
|
|
|
|
+ cs += get_jni_sig(rawString);
|
|
}
|
|
}
|
|
|
|
|
|
cs += ")";
|
|
cs += ")";
|
|
@@ -1511,7 +1521,7 @@ JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_callobject(JNIEnv *en
|
|
int res = env->PushLocalFrame(16);
|
|
int res = env->PushLocalFrame(16);
|
|
ERR_FAIL_COND(res != 0);
|
|
ERR_FAIL_COND(res != 0);
|
|
|
|
|
|
- String str_method = env->GetStringUTFChars(method, NULL);
|
|
|
|
|
|
+ String str_method = jstring_to_string(method, env);
|
|
|
|
|
|
int count = env->GetArrayLength(params);
|
|
int count = env->GetArrayLength(params);
|
|
Variant *vlist = (Variant *)alloca(sizeof(Variant) * count);
|
|
Variant *vlist = (Variant *)alloca(sizeof(Variant) * count);
|
|
@@ -1543,7 +1553,7 @@ JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_calldeferred(JNIEnv *
|
|
int res = env->PushLocalFrame(16);
|
|
int res = env->PushLocalFrame(16);
|
|
ERR_FAIL_COND(res != 0);
|
|
ERR_FAIL_COND(res != 0);
|
|
|
|
|
|
- String str_method = env->GetStringUTFChars(method, NULL);
|
|
|
|
|
|
+ String str_method = jstring_to_string(method, env);
|
|
|
|
|
|
int count = env->GetArrayLength(params);
|
|
int count = env->GetArrayLength(params);
|
|
Variant args[VARIANT_ARG_MAX];
|
|
Variant args[VARIANT_ARG_MAX];
|