summaryrefslogtreecommitdiffstats
path: root/platform/android/java_glue.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'platform/android/java_glue.cpp')
-rw-r--r--platform/android/java_glue.cpp135
1 files changed, 126 insertions, 9 deletions
diff --git a/platform/android/java_glue.cpp b/platform/android/java_glue.cpp
index 8f91f7cc4a..fdc6f1207d 100644
--- a/platform/android/java_glue.cpp
+++ b/platform/android/java_glue.cpp
@@ -38,7 +38,10 @@
#include "globals.h"
#include "thread_jandroid.h"
#include "core/os/keyboard.h"
+#include "java_class_wrapper.h"
+
+static JavaClassWrapper *java_class_wrapper=NULL;
static OS_Android *os_android=NULL;
@@ -153,6 +156,14 @@ jvalue _variant_to_jvalue(JNIEnv *env, Variant::Type p_type, const Variant* p_ar
v.l=arr;
} break;
+ case Variant::RAW_ARRAY: {
+ DVector<uint8_t> array = *p_arg;
+ jbyteArray arr = env->NewByteArray(array.size());
+ DVector<uint8_t>::Read r = array.read();
+ env->SetByteArrayRegion(arr,0,array.size(),reinterpret_cast<const signed char*>(r.ptr()));
+ v.l=arr;
+
+ } break;
case Variant::REAL_ARRAY: {
DVector<float> array = *p_arg;
@@ -244,6 +255,19 @@ Variant _jobject_to_variant(JNIEnv * env, jobject obj) {
return sarr;
};
+ if (name == "[B") {
+
+ jbyteArray arr = (jbyteArray)obj;
+ int fCount = env->GetArrayLength(arr);
+ DVector<uint8_t> sarr;
+ sarr.resize(fCount);
+
+ DVector<uint8_t>::Write w = sarr.write();
+ env->GetByteArrayRegion(arr,0,fCount,reinterpret_cast<signed char*>(w.ptr()));
+ w = DVector<uint8_t>::Write();
+ return sarr;
+ };
+
if (name == "java.lang.Float" || name == "java.lang.Double") {
jclass nclass = env->FindClass("java/lang/Number");
@@ -354,6 +378,7 @@ public:
virtual Variant call(const StringName& p_method,const Variant** p_args,int p_argcount,Variant::CallError &r_error) {
//print_line("attempt to call "+String(p_method));
+ ERR_FAIL_COND_V(!instance,Variant());
r_error.error=Variant::CallError::CALL_OK;
@@ -519,7 +544,10 @@ public:
}
- JNISingleton() {}
+ JNISingleton() {
+ instance=NULL;
+
+ }
};
@@ -556,6 +584,8 @@ static Vector3 accelerometer;
static HashMap<String,JNISingleton*> jni_singletons;
static jobject godot_io;
+static Vector<int> joy_device_ids;
+
typedef void (*GFXInitFunc)(void *ud,bool gl2);
static jmethodID _on_video_init=0;
@@ -660,7 +690,7 @@ static void _stop_video() {
env->CallVoidMethod(godot_io, _stopVideo);
}
-JNIEXPORT void JNICALL Java_com_android_godot_GodotLib_initialize(JNIEnv * env, jobject obj, jobject activity,jboolean p_need_reload_hook) {
+JNIEXPORT void JNICALL Java_com_android_godot_GodotLib_initialize(JNIEnv * env, jobject obj, jobject activity,jboolean p_need_reload_hook, jobjectArray p_cmdline) {
__android_log_print(ANDROID_LOG_INFO,"godot","**INIT EVENT! - %p\n",env);
@@ -722,9 +752,37 @@ JNIEXPORT void JNICALL Java_com_android_godot_GodotLib_initialize(JNIEnv * env,
}
+ const char ** cmdline=NULL;
+ int cmdlen=0;
+ bool use_apk_expansion=false;
+ if (p_cmdline) {
+ cmdlen = env->GetArrayLength(p_cmdline);
+ if (cmdlen) {
+ cmdline = (const char**)malloc((env->GetArrayLength(p_cmdline)+1)*sizeof(const char*));
+ cmdline[cmdlen]=NULL;
- os_android = new OS_Android(_gfx_init_func,env,_open_uri,_get_data_dir,_get_locale, _get_model,_show_vk, _hide_vk,_set_screen_orient,_get_unique_id, _play_video, _is_video_playing, _pause_video, _stop_video);
- os_android->set_need_reload_hooks(p_need_reload_hook);
+ for (int i=0; i<cmdlen; i++) {
+
+ jstring string = (jstring) env->GetObjectArrayElement(p_cmdline, i);
+ const char *rawString = env->GetStringUTFChars(string, 0);
+ if (!rawString) {
+ __android_log_print(ANDROID_LOG_INFO,"godot","cmdline arg %i is null\n",i);
+ } else {
+ // __android_log_print(ANDROID_LOG_INFO,"godot","cmdline arg %i is: %s\n",i,rawString);
+
+ if (strcmp(rawString,"-main_pack")==0)
+ use_apk_expansion=true;
+ }
+
+ cmdline[i]=rawString;
+ }
+ }
+ }
+
+ __android_log_print(ANDROID_LOG_INFO,"godot","CMDLINE LEN %i - APK EXPANSION %I\n",cmdlen,int(use_apk_expansion));
+
+ os_android = new OS_Android(_gfx_init_func,env,_open_uri,_get_data_dir,_get_locale, _get_model,_show_vk, _hide_vk,_set_screen_orient,_get_unique_id, _play_video, _is_video_playing, _pause_video, _stop_video,use_apk_expansion);
+ os_android->set_need_reload_hooks(p_need_reload_hook);
char wd[500];
getcwd(wd,500);
@@ -740,7 +798,7 @@ JNIEXPORT void JNICALL Java_com_android_godot_GodotLib_initialize(JNIEnv * env,
__android_log_print(ANDROID_LOG_INFO,"godot","pre asdasd setup...");
Error err = Main::setup("apk",2,args,false);
#else
- Error err = Main::setup("apk",0,NULL,false);
+ Error err = Main::setup("apk",cmdlen,(char**)cmdline,false);
#endif
if (err!=OK) {
@@ -798,6 +856,7 @@ JNIEXPORT void JNICALL Java_com_android_godot_GodotLib_quit(JNIEnv * env, jobjec
input_mutex->lock();
quit_request=true;
+ print_line("BACK PRESSED");
input_mutex->unlock();
}
@@ -878,6 +937,8 @@ JNIEXPORT void JNICALL Java_com_android_godot_GodotLib_step(JNIEnv * env, jobjec
// ugly hack to initialize the rest of the engine
// because of the way android forces you to do everything with threads
+ java_class_wrapper = memnew( JavaClassWrapper(_godot_instance ));
+ Globals::get_singleton()->add_singleton(Globals::Singleton("JavaClassWrapper",java_class_wrapper));
_initialize_java_modules();
Main::setup2();
@@ -1227,6 +1288,49 @@ static unsigned int android_get_keysym(unsigned int p_code) {
return KEY_UNKNOWN;
}
+static int find_device(int p_device) {
+
+ for (int i=0; i<joy_device_ids.size(); i++) {
+
+ if (joy_device_ids[i] == p_device) {
+ //print_line("found device at "+String::num(i));
+ return i;
+ };
+ };
+
+ //print_line("adding a device at" + String::num(joy_device_ids.size()));
+ joy_device_ids.push_back(p_device);
+
+ return joy_device_ids.size() - 1;
+};
+
+JNIEXPORT void JNICALL Java_com_android_godot_GodotLib_joybutton(JNIEnv * env, jobject obj, jint p_device, jint p_button, jboolean p_pressed) {
+
+ InputEvent ievent;
+ ievent.type = InputEvent::JOYSTICK_BUTTON;
+ ievent.device = find_device(p_device);
+ ievent.joy_button.button_index = p_button;
+ ievent.joy_button.pressed = p_pressed;
+
+ input_mutex->lock();
+ key_events.push_back(ievent);
+ input_mutex->unlock();
+};
+
+JNIEXPORT void JNICALL Java_com_android_godot_GodotLib_joyaxis(JNIEnv * env, jobject obj, jint p_device, jint p_axis, jfloat p_value) {
+
+ InputEvent ievent;
+ ievent.type = InputEvent::JOYSTICK_MOTION;
+ ievent.device = find_device(p_device);
+ ievent.joy_motion.axis = p_axis;
+ ievent.joy_motion.axis_value = p_value;
+
+ input_mutex->lock();
+ key_events.push_back(ievent);
+ input_mutex->unlock();
+};
+
+
JNIEXPORT void JNICALL Java_com_android_godot_GodotLib_key(JNIEnv * env, jobject obj, jint p_scancode, jint p_unicode_char, jboolean p_pressed) {
InputEvent ievent;
@@ -1254,7 +1358,10 @@ JNIEXPORT void JNICALL Java_com_android_godot_GodotLib_key(JNIEnv * env, jobject
} else if (val == 61453) {
ievent.key.scancode = KEY_ENTER;
ievent.key.unicode = KEY_ENTER;
- }
+ } else if (p_scancode==4) {
+
+ quit_request=true;
+ }
input_mutex->lock();
key_events.push_back(ievent);
@@ -1332,6 +1439,7 @@ static Variant::Type get_jni_type(const String& p_type) {
{"double", Variant::REAL},
{"java.lang.String",Variant::STRING},
{"[I",Variant::INT_ARRAY},
+ {"[B",Variant::RAW_ARRAY},
{"[F",Variant::REAL_ARRAY},
{"[java.lang.String",Variant::STRING_ARRAY},
{"com.android.godot.Dictionary", Variant::DICTIONARY},
@@ -1354,7 +1462,7 @@ static Variant::Type get_jni_type(const String& p_type) {
static const char* get_jni_sig(const String& p_type) {
- print_line("getting sig for " + p_type);
+
static struct {
const char *name;
const char *sig;
@@ -1367,6 +1475,7 @@ static const char* get_jni_sig(const String& p_type) {
{"java.lang.String","Ljava/lang/String;"},
{"com.android.godot.Dictionary", "Lcom/android/godot/Dictionary;"},
{"[I","[I"},
+ {"[B","[B"},
{"[F","[F"},
{"[java.lang.String","[Ljava/lang/String;"},
{NULL,"V"}
@@ -1450,7 +1559,9 @@ JNIEXPORT void JNICALL Java_com_android_godot_GodotLib_callobject(JNIEnv * env,
for (int i=0; i<count; i++) {
jobject obj = env->GetObjectArrayElement(params, i);
- Variant v = _jobject_to_variant(env, obj);
+ Variant v;
+ if (obj)
+ v=_jobject_to_variant(env, obj);
memnew_placement(&vlist[i], Variant);
vlist[i] = v;
vptr[i] = &vlist[i];
@@ -1471,13 +1582,19 @@ JNIEXPORT void JNICALL Java_com_android_godot_GodotLib_calldeferred(JNIEnv * env
int count = env->GetArrayLength(params);
Variant args[VARIANT_ARG_MAX];
+// print_line("Java->GD call: "+obj->get_type()+"::"+str_method+" argc "+itos(count));
+
for (int i=0; i<MIN(count,VARIANT_ARG_MAX); i++) {
jobject obj = env->GetObjectArrayElement(params, i);
- args[i] = _jobject_to_variant(env, obj);
+ if (obj)
+ args[i] = _jobject_to_variant(env, obj);
+// print_line("\targ"+itos(i)+": "+Variant::get_type_name(args[i].get_type()));
+
};
+
obj->call_deferred(str_method, args[0],args[1],args[2],args[3],args[4]);
// something
};