diff options
| author | Rémi Verschelde | 2017-03-19 00:36:26 +0100 |
|---|---|---|
| committer | Rémi Verschelde | 2017-03-19 00:36:26 +0100 |
| commit | f8db8a3faa30b71dca33ced38be16d3f93f43e8a (patch) | |
| tree | 3b798318132cca7eccfbca5818ab55656a2896d7 /platform/android | |
| parent | 1d418afe863c9e553b69174ce63aef203c46d2f0 (diff) | |
| download | godot-f8db8a3faa30b71dca33ced38be16d3f93f43e8a.tar.gz godot-f8db8a3faa30b71dca33ced38be16d3f93f43e8a.tar.zst godot-f8db8a3faa30b71dca33ced38be16d3f93f43e8a.zip | |
Bring that Whole New World to the Old Continent too
Applies the clang-format style to the 2.1 branch as done for master in
5dbf1809c6e3e905b94b8764e99491e608122261.
Diffstat (limited to 'platform/android')
24 files changed, 2921 insertions, 3375 deletions
diff --git a/platform/android/audio_driver_jandroid.cpp b/platform/android/audio_driver_jandroid.cpp index 8c57eaaab..b6ac307f2 100644 --- a/platform/android/audio_driver_jandroid.cpp +++ b/platform/android/audio_driver_jandroid.cpp @@ -32,34 +32,32 @@ #include "thread_jandroid.h" #ifndef ANDROID_NATIVE_ACTIVITY -AudioDriverAndroid* AudioDriverAndroid::s_ad=NULL; +AudioDriverAndroid *AudioDriverAndroid::s_ad = NULL; jobject AudioDriverAndroid::io; jmethodID AudioDriverAndroid::_init_audio; jmethodID AudioDriverAndroid::_write_buffer; jmethodID AudioDriverAndroid::_quit; jmethodID AudioDriverAndroid::_pause; -bool AudioDriverAndroid::active=false; +bool AudioDriverAndroid::active = false; jclass AudioDriverAndroid::cls; -int AudioDriverAndroid::audioBufferFrames=0; -int AudioDriverAndroid::mix_rate=44100; -bool AudioDriverAndroid::quit=false; +int AudioDriverAndroid::audioBufferFrames = 0; +int AudioDriverAndroid::mix_rate = 44100; +bool AudioDriverAndroid::quit = false; jobject AudioDriverAndroid::audioBuffer = NULL; -void* AudioDriverAndroid::audioBufferPinned = NULL; -Mutex *AudioDriverAndroid::mutex=NULL; -int32_t* AudioDriverAndroid::audioBuffer32=NULL; +void *AudioDriverAndroid::audioBufferPinned = NULL; +Mutex *AudioDriverAndroid::mutex = NULL; +int32_t *AudioDriverAndroid::audioBuffer32 = NULL; - -const char* AudioDriverAndroid::get_name() const { +const char *AudioDriverAndroid::get_name() const { return "Android"; } - -Error AudioDriverAndroid::init(){ +Error AudioDriverAndroid::init() { mutex = Mutex::create(); -/* + /* // TODO: pass in/return a (Java) device ID, also whether we're opening for input or output this->spec.samples = Android_JNI_OpenAudioDevice(this->spec.freq, this->spec.format == AUDIO_U8 ? 0 : 1, this->spec.channels, this->spec.samples); SDL_CalculateAudioSpec(&this->spec); @@ -71,78 +69,70 @@ Error AudioDriverAndroid::init(){ } */ -// Android_JNI_SetupThread(); - - - // __android_log_print(ANDROID_LOG_VERBOSE, "SDL", "SDL audio: opening device"); + // Android_JNI_SetupThread(); + // __android_log_print(ANDROID_LOG_VERBOSE, "SDL", "SDL audio: opening device"); JNIEnv *env = ThreadAndroid::get_env(); - int mix_rate = GLOBAL_DEF("audio/mix_rate",44100); + int mix_rate = GLOBAL_DEF("audio/mix_rate", 44100); - int latency = GLOBAL_DEF("audio/output_latency",25); - latency=50; - unsigned int buffer_size = nearest_power_of_2( latency * mix_rate / 1000 ); + int latency = GLOBAL_DEF("audio/output_latency", 25); + latency = 50; + unsigned int buffer_size = nearest_power_of_2(latency * mix_rate / 1000); if (OS::get_singleton()->is_stdout_verbose()) { - print_line("audio buffer size: "+itos(buffer_size)); + print_line("audio buffer size: " + itos(buffer_size)); } - __android_log_print(ANDROID_LOG_INFO,"godot","Initializing audio! params: %i,%i ",mix_rate,buffer_size); - audioBuffer = env->CallObjectMethod(io,_init_audio, mix_rate, buffer_size); - + __android_log_print(ANDROID_LOG_INFO, "godot", "Initializing audio! params: %i,%i ", mix_rate, buffer_size); + audioBuffer = env->CallObjectMethod(io, _init_audio, mix_rate, buffer_size); - ERR_FAIL_COND_V( audioBuffer == NULL, ERR_INVALID_PARAMETER); + ERR_FAIL_COND_V(audioBuffer == NULL, ERR_INVALID_PARAMETER); audioBuffer = env->NewGlobalRef(audioBuffer); jboolean isCopy = JNI_FALSE; audioBufferPinned = env->GetShortArrayElements((jshortArray)audioBuffer, &isCopy); audioBufferFrames = env->GetArrayLength((jshortArray)audioBuffer); - audioBuffer32 = memnew_arr(int32_t,audioBufferFrames); + audioBuffer32 = memnew_arr(int32_t, audioBufferFrames); return OK; } -void AudioDriverAndroid::start(){ - active=true; - +void AudioDriverAndroid::start() { + active = true; } -void AudioDriverAndroid::setup( jobject p_io) { +void AudioDriverAndroid::setup(jobject p_io) { JNIEnv *env = ThreadAndroid::get_env(); - io=p_io; + io = p_io; jclass c = env->GetObjectClass(io); cls = (jclass)env->NewGlobalRef(c); - - __android_log_print(ANDROID_LOG_INFO,"godot","starting to attempt get methods"); + __android_log_print(ANDROID_LOG_INFO, "godot", "starting to attempt get methods"); _init_audio = env->GetMethodID(cls, "audioInit", "(II)Ljava/lang/Object;"); - if(_init_audio != 0) { - __android_log_print(ANDROID_LOG_INFO,"godot","*******GOT METHOD _init_audio ok!!"); + if (_init_audio != 0) { + __android_log_print(ANDROID_LOG_INFO, "godot", "*******GOT METHOD _init_audio ok!!"); } else { - __android_log_print(ANDROID_LOG_INFO,"godot","audioinit ok!"); + __android_log_print(ANDROID_LOG_INFO, "godot", "audioinit ok!"); } _write_buffer = env->GetMethodID(cls, "audioWriteShortBuffer", "([S)V"); - if(_write_buffer != 0) { - __android_log_print(ANDROID_LOG_INFO,"godot","*******GOT METHOD _write_buffer ok!!"); + if (_write_buffer != 0) { + __android_log_print(ANDROID_LOG_INFO, "godot", "*******GOT METHOD _write_buffer ok!!"); } - _quit = env->GetMethodID(cls, "audioQuit", "()V"); - if(_quit != 0) { - __android_log_print(ANDROID_LOG_INFO,"godot","*******GOT METHOD _quit ok!!"); + if (_quit != 0) { + __android_log_print(ANDROID_LOG_INFO, "godot", "*******GOT METHOD _quit ok!!"); } _pause = env->GetMethodID(cls, "audioPause", "(Z)V"); - if(_quit != 0) { - __android_log_print(ANDROID_LOG_INFO,"godot","*******GOT METHOD _pause ok!!"); + if (_quit != 0) { + __android_log_print(ANDROID_LOG_INFO, "godot", "*******GOT METHOD _pause ok!!"); } - - } void AudioDriverAndroid::thread_func(JNIEnv *env) { @@ -150,48 +140,44 @@ void AudioDriverAndroid::thread_func(JNIEnv *env) { jclass cls = env->FindClass("org/godotengine/godot/Godot"); if (cls) { - cls=(jclass)env->NewGlobalRef(cls); - __android_log_print(ANDROID_LOG_INFO,"godot","*******CLASS FOUND!!!"); + cls = (jclass)env->NewGlobalRef(cls); + __android_log_print(ANDROID_LOG_INFO, "godot", "*******CLASS FOUND!!!"); } jfieldID fid = env->GetStaticFieldID(cls, "io", "Lorg/godotengine/godot/GodotIO;"); - jobject ob = env->GetStaticObjectField(cls,fid); + jobject ob = env->GetStaticObjectField(cls, fid); jobject gob = env->NewGlobalRef(ob); jclass c = env->GetObjectClass(gob); jclass lcls = (jclass)env->NewGlobalRef(c); _write_buffer = env->GetMethodID(lcls, "audioWriteShortBuffer", "([S)V"); - if(_write_buffer != 0) { - __android_log_print(ANDROID_LOG_INFO,"godot","*******GOT METHOD _write_buffer ok!!"); + if (_write_buffer != 0) { + __android_log_print(ANDROID_LOG_INFO, "godot", "*******GOT METHOD _write_buffer ok!!"); } - while(!quit) { - + while (!quit) { - int16_t* ptr = (int16_t*)audioBufferPinned; + int16_t *ptr = (int16_t *)audioBufferPinned; int fc = audioBufferFrames; - if (!s_ad->active || mutex->try_lock()!=OK) { + if (!s_ad->active || mutex->try_lock() != OK) { - for(int i=0;i<fc;i++) { - ptr[i]=0; + for (int i = 0; i < fc; i++) { + ptr[i] = 0; } } else { - - s_ad->audio_server_process(fc/2,audioBuffer32); + s_ad->audio_server_process(fc / 2, audioBuffer32); mutex->unlock(); - for(int i=0;i<fc;i++) { + for (int i = 0; i < fc; i++) { - ptr[i]=audioBuffer32[i]>>16; + ptr[i] = audioBuffer32[i] >> 16; } - } env->ReleaseShortArrayElements((jshortArray)audioBuffer, (jshort *)ptr, JNI_COMMIT); env->CallVoidMethod(gob, _write_buffer, (jshortArray)audioBuffer); } - } int AudioDriverAndroid::get_mix_rate() const { @@ -199,16 +185,15 @@ int AudioDriverAndroid::get_mix_rate() const { return mix_rate; } -AudioDriverSW::OutputFormat AudioDriverAndroid::get_output_format() const{ +AudioDriverSW::OutputFormat AudioDriverAndroid::get_output_format() const { return OUTPUT_STEREO; } -void AudioDriverAndroid::lock(){ +void AudioDriverAndroid::lock() { if (mutex) mutex->lock(); - } void AudioDriverAndroid::unlock() { @@ -217,7 +202,7 @@ void AudioDriverAndroid::unlock() { mutex->unlock(); } -void AudioDriverAndroid::finish(){ +void AudioDriverAndroid::finish() { JNIEnv *env = ThreadAndroid::get_env(); env->CallVoidMethod(io, _quit); @@ -228,21 +213,19 @@ void AudioDriverAndroid::finish(){ audioBufferPinned = NULL; } - active=false; + active = false; } void AudioDriverAndroid::set_pause(bool p_pause) { JNIEnv *env = ThreadAndroid::get_env(); - env->CallVoidMethod(io, _pause,p_pause); - + env->CallVoidMethod(io, _pause, p_pause); } AudioDriverAndroid::AudioDriverAndroid() { - s_ad=this; - active=false; - + s_ad = this; + active = false; } #endif diff --git a/platform/android/audio_driver_jandroid.h b/platform/android/audio_driver_jandroid.h index 01ce31be8..a8c72acaf 100644 --- a/platform/android/audio_driver_jandroid.h +++ b/platform/android/audio_driver_jandroid.h @@ -36,9 +36,8 @@ class AudioDriverAndroid : public AudioDriverSW { - static Mutex *mutex; - static AudioDriverAndroid* s_ad; + static AudioDriverAndroid *s_ad; static jobject io; static jmethodID _init_audio; static jmethodID _write_buffer; @@ -50,21 +49,19 @@ class AudioDriverAndroid : public AudioDriverSW { static jclass cls; static jobject audioBuffer; - static void* audioBufferPinned; - static int32_t* audioBuffer32; + static void *audioBufferPinned; + static int32_t *audioBuffer32; static int audioBufferFrames; static int mix_rate; - public: - void set_singleton(); - virtual const char* get_name() const; + virtual const char *get_name() const; virtual Error init(); virtual void start(); - virtual int get_mix_rate() const ; + virtual int get_mix_rate() const; virtual OutputFormat get_output_format() const; virtual void lock(); virtual void unlock(); @@ -72,7 +69,7 @@ public: virtual void set_pause(bool p_pause); - static void setup( jobject act); + static void setup(jobject act); static void thread_func(JNIEnv *env); AudioDriverAndroid(); diff --git a/platform/android/audio_driver_opensl.cpp b/platform/android/audio_driver_opensl.cpp index 5e3cfcbba..82483286d 100644 --- a/platform/android/audio_driver_opensl.cpp +++ b/platform/android/audio_driver_opensl.cpp @@ -29,57 +29,50 @@ #include "audio_driver_opensl.h" #include <string.h> - - - - #define MAX_NUMBER_INTERFACES 3 #define MAX_NUMBER_OUTPUT_DEVICES 6 /* Structure for passing information to callback function */ - void AudioDriverOpenSL::_buffer_callback( - SLAndroidSimpleBufferQueueItf queueItf - /* SLuint32 eventFlags, + SLAndroidSimpleBufferQueueItf queueItf + /* SLuint32 eventFlags, const void * pBuffer, SLuint32 bufferSize, SLuint32 dataUsed*/) { - bool mix=true; + bool mix = true; if (pause) { - mix=false; + mix = false; } else if (mutex) { - mix = mutex->try_lock()==OK; + mix = mutex->try_lock() == OK; } if (mix) { - audio_server_process(buffer_size,mixdown_buffer); + audio_server_process(buffer_size, mixdown_buffer); } else { - int32_t* src_buff=mixdown_buffer; - for(int i=0;i<buffer_size*2;i++) { - src_buff[i]=0; + int32_t *src_buff = mixdown_buffer; + for (int i = 0; i < buffer_size * 2; i++) { + src_buff[i] = 0; } } if (mutex && mix) mutex->unlock(); + const int32_t *src_buff = mixdown_buffer; - const int32_t* src_buff=mixdown_buffer; - - int16_t *ptr = (int16_t*)buffers[last_free]; - last_free=(last_free+1)%BUFFER_COUNT; + int16_t *ptr = (int16_t *)buffers[last_free]; + last_free = (last_free + 1) % BUFFER_COUNT; - for(int i=0;i<buffer_size*2;i++) { + for (int i = 0; i < buffer_size * 2; i++) { - ptr[i]=src_buff[i]>>16; + ptr[i] = src_buff[i] >> 16; } - (*queueItf)->Enqueue(queueItf, ptr, 4 * buffer_size); - + (*queueItf)->Enqueue(queueItf, ptr, 4 * buffer_size); #if 0 SLresult res; @@ -98,25 +91,22 @@ void AudioDriverOpenSL::_buffer_callback( } void AudioDriverOpenSL::_buffer_callbacks( - SLAndroidSimpleBufferQueueItf queueItf, - /*SLuint32 eventFlags, + SLAndroidSimpleBufferQueueItf queueItf, + /*SLuint32 eventFlags, const void * pBuffer, SLuint32 bufferSize, SLuint32 dataUsed,*/ - void *pContext) { - + void *pContext) { - AudioDriverOpenSL *ad = (AudioDriverOpenSL*)pContext; + AudioDriverOpenSL *ad = (AudioDriverOpenSL *)pContext; -// ad->_buffer_callback(queueItf,eventFlags,pBuffer,bufferSize,dataUsed); + // ad->_buffer_callback(queueItf,eventFlags,pBuffer,bufferSize,dataUsed); ad->_buffer_callback(queueItf); - } +AudioDriverOpenSL *AudioDriverOpenSL::s_ad = NULL; -AudioDriverOpenSL* AudioDriverOpenSL::s_ad=NULL; - -const char* AudioDriverOpenSL::get_name() const { +const char *AudioDriverOpenSL::get_name() const { return "Android"; } @@ -180,23 +170,23 @@ int AudioDriverOpenSL::thread_func(SceSize args, void *argp) { } #endif -Error AudioDriverOpenSL::init(){ +Error AudioDriverOpenSL::init() { SLresult - res; + res; SLEngineOption EngineOption[] = { - (SLuint32) SL_ENGINEOPTION_THREADSAFE, - (SLuint32) SL_BOOLEAN_TRUE + (SLuint32)SL_ENGINEOPTION_THREADSAFE, + (SLuint32)SL_BOOLEAN_TRUE }; - res = slCreateEngine( &sl, 1, EngineOption, 0, NULL, NULL); - if (res!=SL_RESULT_SUCCESS) { + res = slCreateEngine(&sl, 1, EngineOption, 0, NULL, NULL); + if (res != SL_RESULT_SUCCESS) { ERR_EXPLAIN("Could not Initialize OpenSL"); ERR_FAIL_V(ERR_INVALID_PARAMETER); } res = (*sl)->Realize(sl, SL_BOOLEAN_FALSE); - if (res!=SL_RESULT_SUCCESS) { + if (res != SL_RESULT_SUCCESS) { ERR_EXPLAIN("Could not Realize OpenSL"); ERR_FAIL_V(ERR_INVALID_PARAMETER); @@ -205,37 +195,33 @@ Error AudioDriverOpenSL::init(){ print_line("OpenSL Init OK!"); return OK; - } -void AudioDriverOpenSL::start(){ - +void AudioDriverOpenSL::start() { mutex = Mutex::create(); - active=false; - + active = false; SLint32 numOutputs = 0; SLuint32 deviceID = 0; SLresult res; - buffer_size = 1024; - for(int i=0;i<BUFFER_COUNT;i++) { + for (int i = 0; i < BUFFER_COUNT; i++) { - buffers[i]=memnew_arr( int16_t,buffer_size*2 ); - memset(buffers[i],0,buffer_size*4); + buffers[i] = memnew_arr(int16_t, buffer_size * 2); + memset(buffers[i], 0, buffer_size * 4); } - mixdown_buffer = memnew_arr( int32_t,buffer_size* 2); + mixdown_buffer = memnew_arr(int32_t, buffer_size * 2); /* Callback context for the buffer queue callback function */ /* Get the SL Engine Interface which is implicit */ - res = (*sl)->GetInterface(sl, SL_IID_ENGINE, (void*)&EngineItf); + res = (*sl)->GetInterface(sl, SL_IID_ENGINE, (void *)&EngineItf); - ERR_FAIL_COND( res !=SL_RESULT_SUCCESS ); + ERR_FAIL_COND(res != SL_RESULT_SUCCESS); /* Initialize arrays required[] and iidArray[] */ SLboolean required[MAX_NUMBER_INTERFACES]; SLInterfaceID iidArray[MAX_NUMBER_INTERFACES]; @@ -257,22 +243,20 @@ void AudioDriverOpenSL::start(){ #else { - const SLInterfaceID ids[1] = {SL_IID_ENVIRONMENTALREVERB}; - const SLboolean req[1] = {SL_BOOLEAN_FALSE}; - res = (*EngineItf)->CreateOutputMix(EngineItf, &OutputMix, 0, - ids, req); + const SLInterfaceID ids[1] = { SL_IID_ENVIRONMENTALREVERB }; + const SLboolean req[1] = { SL_BOOLEAN_FALSE }; + res = (*EngineItf)->CreateOutputMix(EngineItf, &OutputMix, 0, ids, req); } - #endif - ERR_FAIL_COND( res !=SL_RESULT_SUCCESS ); - // Realizing the Output Mix object in synchronous mode. + ERR_FAIL_COND(res != SL_RESULT_SUCCESS); + // Realizing the Output Mix object in synchronous mode. res = (*OutputMix)->Realize(OutputMix, SL_BOOLEAN_FALSE); - ERR_FAIL_COND( res !=SL_RESULT_SUCCESS ); + ERR_FAIL_COND(res != SL_RESULT_SUCCESS); - SLDataLocator_AndroidSimpleBufferQueue loc_bufq = {SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE, BUFFER_COUNT}; -// bufferQueue.locatorType = SL_DATALOCATOR_BUFFERQUEUE; -// bufferQueue.numBuffers = BUFFER_COUNT; /* Four buffers in our buffer queue */ + SLDataLocator_AndroidSimpleBufferQueue loc_bufq = { SL_DATALOCATOR_ANDROIDSIMPLEBUFFERQUEUE, BUFFER_COUNT }; + // bufferQueue.locatorType = SL_DATALOCATOR_BUFFERQUEUE; + // bufferQueue.numBuffers = BUFFER_COUNT; /* Four buffers in our buffer queue */ /* Setup the format of the content in the buffer queue */ pcm.formatType = SL_DATAFORMAT_PCM; pcm.numChannels = 2; @@ -288,14 +272,13 @@ void AudioDriverOpenSL::start(){ audioSource.pFormat = (void *)&pcm; audioSource.pLocator = (void *)&loc_bufq; - /* Setup the data sink structure */ locator_outputmix.locatorType = SL_DATALOCATOR_OUTPUTMIX; - locator_outputmix.outputMix= OutputMix; + locator_outputmix.outputMix = OutputMix; audioSink.pLocator = (void *)&locator_outputmix; audioSink.pFormat = NULL; /* Initialize the context for Buffer queue callbacks */ -// cntxt.pDataBase = (void*)&pcmData; + // cntxt.pDataBase = (void*)&pcmData; //cntxt.pData = cntxt.pDataBase; //cntxt.size = sizeof(pcmData); /* Set arrays required[] and iidArray[] for SEEK interface @@ -305,27 +288,25 @@ void AudioDriverOpenSL::start(){ /* Create the music player */ { - const SLInterfaceID ids[2] = {SL_IID_BUFFERQUEUE, SL_IID_EFFECTSEND}; - const SLboolean req[2] = {SL_BOOLEAN_TRUE, SL_BOOLEAN_TRUE}; + const SLInterfaceID ids[2] = { SL_IID_BUFFERQUEUE, SL_IID_EFFECTSEND }; + const SLboolean req[2] = { SL_BOOLEAN_TRUE, SL_BOOLEAN_TRUE }; - res = (*EngineItf)->CreateAudioPlayer(EngineItf, &player, - &audioSource, &audioSink, 1, ids, req); - ERR_FAIL_COND( res !=SL_RESULT_SUCCESS ); + res = (*EngineItf)->CreateAudioPlayer(EngineItf, &player, &audioSource, &audioSink, 1, ids, req); + ERR_FAIL_COND(res != SL_RESULT_SUCCESS); } /* Realizing the player in synchronous mode. */ res = (*player)->Realize(player, SL_BOOLEAN_FALSE); - ERR_FAIL_COND( res !=SL_RESULT_SUCCESS ); + ERR_FAIL_COND(res != SL_RESULT_SUCCESS); /* Get seek and play interfaces */ - res = (*player)->GetInterface(player, SL_IID_PLAY, (void*)&playItf); - ERR_FAIL_COND( res !=SL_RESULT_SUCCESS ); + res = (*player)->GetInterface(player, SL_IID_PLAY, (void *)&playItf); + ERR_FAIL_COND(res != SL_RESULT_SUCCESS); res = (*player)->GetInterface(player, SL_IID_BUFFERQUEUE, - (void*)&bufferQueueItf); - ERR_FAIL_COND( res !=SL_RESULT_SUCCESS ); + (void *)&bufferQueueItf); + ERR_FAIL_COND(res != SL_RESULT_SUCCESS); /* Setup to receive buffer queue event callbacks */ - res = (*bufferQueueItf)->RegisterCallback(bufferQueueItf, - _buffer_callbacks, this); - ERR_FAIL_COND( res !=SL_RESULT_SUCCESS ); - /* Before we start set volume to -3dB (-300mB) */ + res = (*bufferQueueItf)->RegisterCallback(bufferQueueItf, _buffer_callbacks, this); + ERR_FAIL_COND(res != SL_RESULT_SUCCESS); +/* Before we start set volume to -3dB (-300mB) */ #if 0 res = (*OutputMix)->GetInterface(OutputMix, SL_IID_VOLUME, (void*)&volumeItf); @@ -335,19 +316,17 @@ void AudioDriverOpenSL::start(){ res = (*volumeItf)->SetVolumeLevel(volumeItf, -300); ERR_FAIL_COND( res !=SL_RESULT_SUCCESS ); #endif - last_free=0; + last_free = 0; #if 1 //fill up buffers - for(int i=0;i<BUFFER_COUNT;i++) { + for (int i = 0; i < BUFFER_COUNT; i++) { /* Enqueue a few buffers to get the ball rolling */ - res = (*bufferQueueItf)->Enqueue(bufferQueueItf, buffers[i], - 4 * buffer_size); /* Size given in */ - + res = (*bufferQueueItf)->Enqueue(bufferQueueItf, buffers[i], 4 * buffer_size); /* Size given in */ } #endif res = (*playItf)->SetPlayState(playItf, SL_PLAYSTATE_PLAYING); - ERR_FAIL_COND( res !=SL_RESULT_SUCCESS ); + ERR_FAIL_COND(res != SL_RESULT_SUCCESS); #if 0 res = (*bufferQueueItf)->GetState(bufferQueueItf, &state); @@ -365,7 +344,7 @@ void AudioDriverOpenSL::start(){ (*OutputMix)->Destroy(OutputMix); #endif - active=true; + active = true; } int AudioDriverOpenSL::get_mix_rate() const { @@ -373,34 +352,31 @@ int AudioDriverOpenSL::get_mix_rate() const { return 44100; } -AudioDriverSW::OutputFormat AudioDriverOpenSL::get_output_format() const{ +AudioDriverSW::OutputFormat AudioDriverOpenSL::get_output_format() const { return OUTPUT_STEREO; } -void AudioDriverOpenSL::lock(){ +void AudioDriverOpenSL::lock() { if (active && mutex) mutex->lock(); - } void AudioDriverOpenSL::unlock() { if (active && mutex) mutex->unlock(); - } -void AudioDriverOpenSL::finish(){ +void AudioDriverOpenSL::finish() { (*sl)->Destroy(sl); - } void AudioDriverOpenSL::set_pause(bool p_pause) { - pause=p_pause; + pause = p_pause; if (active) { if (pause) { @@ -411,13 +387,8 @@ void AudioDriverOpenSL::set_pause(bool p_pause) { } } - -AudioDriverOpenSL::AudioDriverOpenSL() -{ - s_ad=this; - mutex=Mutex::create();//NULL; - pause=false; +AudioDriverOpenSL::AudioDriverOpenSL() { + s_ad = this; + mutex = Mutex::create(); //NULL; + pause = false; } - - - diff --git a/platform/android/audio_driver_opensl.h b/platform/android/audio_driver_opensl.h index 8839d20ba..a27277a1c 100644 --- a/platform/android/audio_driver_opensl.h +++ b/platform/android/audio_driver_opensl.h @@ -29,13 +29,10 @@ #ifndef AUDIO_DRIVER_OPENSL_H #define AUDIO_DRIVER_OPENSL_H - - -#include "servers/audio/audio_server_sw.h" +#include "SLES/OpenSLES_Android.h" #include "os/mutex.h" +#include "servers/audio/audio_server_sw.h" #include <SLES/OpenSLES.h> -#include "SLES/OpenSLES_Android.h" - class AudioDriverOpenSL : public AudioDriverSW { @@ -44,18 +41,16 @@ class AudioDriverOpenSL : public AudioDriverSW { enum { - BUFFER_COUNT=2 + BUFFER_COUNT = 2 }; bool pause; - uint32_t buffer_size; int16_t *buffers[BUFFER_COUNT]; int32_t *mixdown_buffer; int last_free; - SLPlayItf playItf; SLObjectItf sl; SLEngineItf EngineItf; @@ -69,31 +64,31 @@ class AudioDriverOpenSL : public AudioDriverSW { SLDataLocator_OutputMix locator_outputmix; SLBufferQueueState state; - static AudioDriverOpenSL* s_ad; + static AudioDriverOpenSL *s_ad; void _buffer_callback( - SLAndroidSimpleBufferQueueItf queueItf - /* SLuint32 eventFlags, + SLAndroidSimpleBufferQueueItf queueItf + /* SLuint32 eventFlags, const void * pBuffer, SLuint32 bufferSize, SLuint32 dataUsed*/); static void _buffer_callbacks( - SLAndroidSimpleBufferQueueItf queueItf, - /*SLuint32 eventFlags, + SLAndroidSimpleBufferQueueItf queueItf, + /*SLuint32 eventFlags, const void * pBuffer, SLuint32 bufferSize, SLuint32 dataUsed,*/ - void *pContext); -public: + void *pContext); +public: void set_singleton(); - virtual const char* get_name() const; + virtual const char *get_name() const; virtual Error init(); virtual void start(); - virtual int get_mix_rate() const ; + virtual int get_mix_rate() const; virtual OutputFormat get_output_format() const; virtual void lock(); virtual void unlock(); @@ -105,4 +100,3 @@ public: }; #endif // AUDIO_DRIVER_ANDROID_H - diff --git a/platform/android/cpu-features.h b/platform/android/cpu-features.h index 01b7fe207..e926f9b53 100644 --- a/platform/android/cpu-features.h +++ b/platform/android/cpu-features.h @@ -28,26 +28,26 @@ #ifndef CPU_FEATURES_H #define CPU_FEATURES_H -#include <sys/cdefs.h> #include <stdint.h> +#include <sys/cdefs.h> __BEGIN_DECLS typedef enum { - ANDROID_CPU_FAMILY_UNKNOWN = 0, - ANDROID_CPU_FAMILY_ARM, - ANDROID_CPU_FAMILY_X86, - ANDROID_CPU_FAMILY_MIPS, - ANDROID_CPU_FAMILY_ARM64, - ANDROID_CPU_FAMILY_X86_64, - ANDROID_CPU_FAMILY_MIPS64, + ANDROID_CPU_FAMILY_UNKNOWN = 0, + ANDROID_CPU_FAMILY_ARM, + ANDROID_CPU_FAMILY_X86, + ANDROID_CPU_FAMILY_MIPS, + ANDROID_CPU_FAMILY_ARM64, + ANDROID_CPU_FAMILY_X86_64, + ANDROID_CPU_FAMILY_MIPS64, - ANDROID_CPU_FAMILY_MAX /* do not remove */ + ANDROID_CPU_FAMILY_MAX /* do not remove */ } AndroidCpuFamily; /* Return family of the device's CPU */ -extern AndroidCpuFamily android_getCpuFamily(void); +extern AndroidCpuFamily android_getCpuFamily(void); /* The list of feature flags for ARM CPUs that can be recognized by the * library. Value details are: @@ -155,31 +155,31 @@ extern AndroidCpuFamily android_getCpuFamily(void); * Allows the use of iWMMXt instrinsics with GCC. */ enum { - ANDROID_CPU_ARM_FEATURE_ARMv7 = (1 << 0), - ANDROID_CPU_ARM_FEATURE_VFPv3 = (1 << 1), - ANDROID_CPU_ARM_FEATURE_NEON = (1 << 2), - ANDROID_CPU_ARM_FEATURE_LDREX_STREX = (1 << 3), - ANDROID_CPU_ARM_FEATURE_VFPv2 = (1 << 4), - ANDROID_CPU_ARM_FEATURE_VFP_D32 = (1 << 5), - ANDROID_CPU_ARM_FEATURE_VFP_FP16 = (1 << 6), - ANDROID_CPU_ARM_FEATURE_VFP_FMA = (1 << 7), - ANDROID_CPU_ARM_FEATURE_NEON_FMA = (1 << 8), - ANDROID_CPU_ARM_FEATURE_IDIV_ARM = (1 << 9), - ANDROID_CPU_ARM_FEATURE_IDIV_THUMB2 = (1 << 10), - ANDROID_CPU_ARM_FEATURE_iWMMXt = (1 << 11), + ANDROID_CPU_ARM_FEATURE_ARMv7 = (1 << 0), + ANDROID_CPU_ARM_FEATURE_VFPv3 = (1 << 1), + ANDROID_CPU_ARM_FEATURE_NEON = (1 << 2), + ANDROID_CPU_ARM_FEATURE_LDREX_STREX = (1 << 3), + ANDROID_CPU_ARM_FEATURE_VFPv2 = (1 << 4), + ANDROID_CPU_ARM_FEATURE_VFP_D32 = (1 << 5), + ANDROID_CPU_ARM_FEATURE_VFP_FP16 = (1 << 6), + ANDROID_CPU_ARM_FEATURE_VFP_FMA = (1 << 7), + ANDROID_CPU_ARM_FEATURE_NEON_FMA = (1 << 8), + ANDROID_CPU_ARM_FEATURE_IDIV_ARM = (1 << 9), + ANDROID_CPU_ARM_FEATURE_IDIV_THUMB2 = (1 << 10), + ANDROID_CPU_ARM_FEATURE_iWMMXt = (1 << 11), }; enum { - ANDROID_CPU_X86_FEATURE_SSSE3 = (1 << 0), - ANDROID_CPU_X86_FEATURE_POPCNT = (1 << 1), - ANDROID_CPU_X86_FEATURE_MOVBE = (1 << 2), + ANDROID_CPU_X86_FEATURE_SSSE3 = (1 << 0), + ANDROID_CPU_X86_FEATURE_POPCNT = (1 << 1), + ANDROID_CPU_X86_FEATURE_MOVBE = (1 << 2), }; -extern uint64_t android_getCpuFeatures(void); +extern uint64_t android_getCpuFeatures(void); #define android_getCpuFeaturesExt android_getCpuFeatures /* Return the number of CPU cores detected on this device. */ -extern int android_getCpuCount(void); +extern int android_getCpuCount(void); /* The following is used to force the CPU count and features * mask in sandboxed processes. Under 4.1 and higher, these processes @@ -191,8 +191,8 @@ extern int android_getCpuCount(void); * * This function return 1 on success, and 0 on failure. */ -extern int android_setCpu(int cpu_count, - uint64_t cpu_features); +extern int android_setCpu(int cpu_count, + uint64_t cpu_features); #ifdef __arm__ /* Retrieve the ARM 32-bit CPUID value from the kernel. @@ -204,9 +204,9 @@ extern uint32_t android_getCpuIdArm(void); /* An ARM-specific variant of android_setCpu() that also allows you * to set the ARM CPUID field. */ -extern int android_setCpuArm(int cpu_count, - uint64_t cpu_features, - uint32_t cpu_id); +extern int android_setCpuArm(int cpu_count, + uint64_t cpu_features, + uint32_t cpu_id); #endif __END_DECLS diff --git a/platform/android/dir_access_android.cpp b/platform/android/dir_access_android.cpp index 1dd8a945e..47b3909d1 100644 --- a/platform/android/dir_access_android.cpp +++ b/platform/android/dir_access_android.cpp @@ -30,8 +30,6 @@ #include "dir_access_android.h" #include "file_access_android.h" - - DirAccess *DirAccessAndroid::create_fs() { return memnew(DirAccessAndroid); @@ -41,36 +39,33 @@ bool DirAccessAndroid::list_dir_begin() { list_dir_end(); - AAssetDir* aad = AAssetManager_openDir(FileAccessAndroid::asset_manager,current_dir.utf8().get_data()); + AAssetDir *aad = AAssetManager_openDir(FileAccessAndroid::asset_manager, current_dir.utf8().get_data()); if (!aad) return true; //nothing - return false; } -String DirAccessAndroid::get_next(){ +String DirAccessAndroid::get_next() { - const char* fn= AAssetDir_getNextFileName(aad); + const char *fn = AAssetDir_getNextFileName(aad); if (!fn) return ""; String s; s.parse_utf8(fn); - current=s; + current = s; return s; - - } -bool DirAccessAndroid::current_is_dir() const{ +bool DirAccessAndroid::current_is_dir() const { String sd; - if (current_dir=="") - sd=current; + if (current_dir == "") + sd = current; else - sd=current_dir+"/"+current; + sd = current_dir + "/" + current; - AAssetDir* aad2 = AAssetManager_openDir(FileAccessAndroid::asset_manager,sd.utf8().get_data()); + AAssetDir *aad2 = AAssetManager_openDir(FileAccessAndroid::asset_manager, sd.utf8().get_data()); if (aad2) { AAssetDir_close(aad2); @@ -78,56 +73,54 @@ bool DirAccessAndroid::current_is_dir() const{ } return false; - } -bool DirAccessAndroid::current_is_hidden() const{ - return current!="." && current!=".." && current.begins_with("."); +bool DirAccessAndroid::current_is_hidden() const { + return current != "." && current != ".." && current.begins_with("."); } -void DirAccessAndroid::list_dir_end(){ +void DirAccessAndroid::list_dir_end() { - if (aad==NULL) + if (aad == NULL) return; AAssetDir_close(aad); - aad=NULL; - + aad = NULL; } -int DirAccessAndroid::get_drive_count(){ +int DirAccessAndroid::get_drive_count() { return 0; } -String DirAccessAndroid::get_drive(int p_drive){ +String DirAccessAndroid::get_drive(int p_drive) { return ""; } -Error DirAccessAndroid::change_dir(String p_dir){ +Error DirAccessAndroid::change_dir(String p_dir) { - p_dir=p_dir.simplify_path(); + p_dir = p_dir.simplify_path(); - if (p_dir=="" || p_dir=="." || (p_dir==".." && current_dir=="")) + if (p_dir == "" || p_dir == "." || (p_dir == ".." && current_dir == "")) return OK; String new_dir; if (p_dir.begins_with("/")) - new_dir=p_dir.substr(1,p_dir.length()); + new_dir = p_dir.substr(1, p_dir.length()); else if (p_dir.begins_with("res://")) - new_dir=p_dir.substr(6,p_dir.length()); - else //relative - new_dir=new_dir+"/"+p_dir; + new_dir = p_dir.substr(6, p_dir.length()); + else //relative + new_dir = new_dir + "/" + p_dir; -//test if newdir exists - new_dir=new_dir.simplify_path(); + //test if newdir exists + new_dir = new_dir.simplify_path(); - AAssetDir* aad = AAssetManager_openDir(FileAccessAndroid::asset_manager,new_dir.utf8().get_data()); + AAssetDir *aad = AAssetManager_openDir(FileAccessAndroid::asset_manager, new_dir.utf8().get_data()); if (aad) { - current_dir=new_dir; + current_dir = new_dir; AAssetDir_close(aad); return OK; } @@ -135,21 +128,20 @@ Error DirAccessAndroid::change_dir(String p_dir){ return ERR_INVALID_PARAMETER; } -String DirAccessAndroid::get_current_dir(){ +String DirAccessAndroid::get_current_dir() { - return "/"+current_dir; + return "/" + current_dir; } - -bool DirAccessAndroid::file_exists(String p_file){ +bool DirAccessAndroid::file_exists(String p_file) { String sd; - if (current_dir=="") - sd=p_file; + if (current_dir == "") + sd = p_file; else - sd=current_dir+"/"+p_file; + sd = current_dir + "/" + p_file; - AAsset *a=AAssetManager_open(FileAccessAndroid::asset_manager,sd.utf8().get_data(),AASSET_MODE_STREAMING); + AAsset *a = AAssetManager_open(FileAccessAndroid::asset_manager, sd.utf8().get_data(), AASSET_MODE_STREAMING); if (a) { AAsset_close(a); return true; @@ -158,18 +150,17 @@ bool DirAccessAndroid::file_exists(String p_file){ return false; } - -Error DirAccessAndroid::make_dir(String p_dir){ +Error DirAccessAndroid::make_dir(String p_dir) { ERR_FAIL_V(ERR_UNAVAILABLE); } -Error DirAccessAndroid::rename(String p_from, String p_to){ +Error DirAccessAndroid::rename(String p_from, String p_to) { ERR_FAIL_V(ERR_UNAVAILABLE); } -Error DirAccessAndroid::remove(String p_name){ +Error DirAccessAndroid::remove(String p_name) { ERR_FAIL_V(ERR_UNAVAILABLE); } @@ -182,12 +173,12 @@ size_t DirAccessAndroid::get_space_left() { void DirAccessAndroid::make_default() { - instance_func=create_fs; + instance_func = create_fs; } DirAccessAndroid::DirAccessAndroid() { - aad=NULL; + aad = NULL; } DirAccessAndroid::~DirAccessAndroid() { diff --git a/platform/android/dir_access_android.h b/platform/android/dir_access_android.h index 15c29a9a0..10f6b680f 100644 --- a/platform/android/dir_access_android.h +++ b/platform/android/dir_access_android.h @@ -32,23 +32,20 @@ #ifdef ANDROID_NATIVE_ACTIVITY #include "os/dir_access.h" -#include <stdio.h> #include <android/asset_manager.h> #include <android/log.h> #include <android_native_app_glue.h> +#include <stdio.h> +class DirAccessAndroid : public DirAccess { - -class DirAccessAndroid : public DirAccess { - - AAssetDir* aad; + AAssetDir *aad; String current_dir; String current; static DirAccess *create_fs(); public: - virtual bool list_dir_begin(); ///< This starts dir listing virtual String get_next(); virtual bool current_is_dir() const; @@ -61,10 +58,8 @@ public: virtual Error change_dir(String p_dir); ///< can be relative or absolute, return false on success virtual String get_current_dir(); ///< return current dir location - virtual bool file_exists(String p_file); - virtual Error make_dir(String p_dir); virtual Error rename(String p_from, String p_to); diff --git a/platform/android/dir_access_jandroid.cpp b/platform/android/dir_access_jandroid.cpp index bbd041f6c..f9b884801 100644 --- a/platform/android/dir_access_jandroid.cpp +++ b/platform/android/dir_access_jandroid.cpp @@ -30,17 +30,15 @@ #include "dir_access_jandroid.h" #include "file_access_jandroid.h" -#include "thread_jandroid.h" #include "print_string.h" +#include "thread_jandroid.h" - -jobject DirAccessJAndroid::io=NULL; -jclass DirAccessJAndroid::cls=NULL; -jmethodID DirAccessJAndroid::_dir_open=NULL; -jmethodID DirAccessJAndroid::_dir_next=NULL; -jmethodID DirAccessJAndroid::_dir_close=NULL; -jmethodID DirAccessJAndroid::_dir_is_dir=NULL; - +jobject DirAccessJAndroid::io = NULL; +jclass DirAccessJAndroid::cls = NULL; +jmethodID DirAccessJAndroid::_dir_open = NULL; +jmethodID DirAccessJAndroid::_dir_next = NULL; +jmethodID DirAccessJAndroid::_dir_close = NULL; +jmethodID DirAccessJAndroid::_dir_is_dir = NULL; DirAccess *DirAccessJAndroid::create_fs() { @@ -53,118 +51,113 @@ bool DirAccessJAndroid::list_dir_begin() { JNIEnv *env = ThreadAndroid::get_env(); jstring js = env->NewStringUTF(current_dir.utf8().get_data()); - int res = env->CallIntMethod(io,_dir_open,js); - if (res<=0) + int res = env->CallIntMethod(io, _dir_open, js); + if (res <= 0) return true; - id=res; + id = res; return false; } -String DirAccessJAndroid::get_next(){ +String DirAccessJAndroid::get_next() { - ERR_FAIL_COND_V(id==0,""); + ERR_FAIL_COND_V(id == 0, ""); JNIEnv *env = ThreadAndroid::get_env(); - jstring str= (jstring)env->CallObjectMethod(io,_dir_next,id); + jstring str = (jstring)env->CallObjectMethod(io, _dir_next, id); if (!str) return ""; - String ret = String::utf8(env->GetStringUTFChars( (jstring)str, NULL )); + String ret = String::utf8(env->GetStringUTFChars((jstring)str, NULL)); env->DeleteLocalRef((jobject)str); return ret; - } -bool DirAccessJAndroid::current_is_dir() const{ - +bool DirAccessJAndroid::current_is_dir() const { JNIEnv *env = ThreadAndroid::get_env(); - return env->CallBooleanMethod(io,_dir_is_dir,id); - + return env->CallBooleanMethod(io, _dir_is_dir, id); } bool DirAccessJAndroid::current_is_hidden() const { - return current!="." && current!=".." && current.begins_with("."); + return current != "." && current != ".." && current.begins_with("."); } -void DirAccessJAndroid::list_dir_end(){ +void DirAccessJAndroid::list_dir_end() { - if (id==0) + if (id == 0) return; JNIEnv *env = ThreadAndroid::get_env(); - env->CallVoidMethod(io,_dir_close,id); - id=0; - - + env->CallVoidMethod(io, _dir_close, id); + id = 0; } -int DirAccessJAndroid::get_drive_count(){ +int DirAccessJAndroid::get_drive_count() { return 0; } -String DirAccessJAndroid::get_drive(int p_drive){ +String DirAccessJAndroid::get_drive(int p_drive) { return ""; } -Error DirAccessJAndroid::change_dir(String p_dir){ +Error DirAccessJAndroid::change_dir(String p_dir) { JNIEnv *env = ThreadAndroid::get_env(); - p_dir=p_dir.simplify_path(); + p_dir = p_dir.simplify_path(); - if (p_dir=="" || p_dir=="." || (p_dir==".." && current_dir=="")) + if (p_dir == "" || p_dir == "." || (p_dir == ".." && current_dir == "")) return OK; String new_dir; - if (p_dir!="res://" && p_dir.length()>1 && p_dir.ends_with("/")) - p_dir=p_dir.substr(0,p_dir.length()-1); + if (p_dir != "res://" && p_dir.length() > 1 && p_dir.ends_with("/")) + p_dir = p_dir.substr(0, p_dir.length() - 1); if (p_dir.begins_with("/")) - new_dir=p_dir.substr(1,p_dir.length()); + new_dir = p_dir.substr(1, p_dir.length()); else if (p_dir.begins_with("res://")) - new_dir=p_dir.substr(6,p_dir.length()); - else if (current_dir=="") - new_dir=p_dir; + new_dir = p_dir.substr(6, p_dir.length()); + else if (current_dir == "") + new_dir = p_dir; else - new_dir=current_dir.plus_file(p_dir); + new_dir = current_dir.plus_file(p_dir); //print_line("new dir is: "+new_dir); -//test if newdir exists - new_dir=new_dir.simplify_path(); + //test if newdir exists + new_dir = new_dir.simplify_path(); jstring js = env->NewStringUTF(new_dir.utf8().get_data()); - int res = env->CallIntMethod(io,_dir_open,js); + int res = env->CallIntMethod(io, _dir_open, js); env->DeleteLocalRef(js); - if (res<=0) + if (res <= 0) return ERR_INVALID_PARAMETER; - env->CallVoidMethod(io,_dir_close,res); + env->CallVoidMethod(io, _dir_close, res); - current_dir=new_dir; + current_dir = new_dir; return OK; } -String DirAccessJAndroid::get_current_dir(){ +String DirAccessJAndroid::get_current_dir() { - return "res://"+current_dir; + return "res://" + current_dir; } -bool DirAccessJAndroid::file_exists(String p_file){ +bool DirAccessJAndroid::file_exists(String p_file) { JNIEnv *env = ThreadAndroid::get_env(); String sd; - if (current_dir=="") - sd=p_file; + if (current_dir == "") + sd = p_file; else - sd=current_dir.plus_file(p_file); + sd = current_dir.plus_file(p_file); FileAccessJAndroid *f = memnew(FileAccessJAndroid); bool exists = f->file_exists(sd); @@ -179,45 +172,44 @@ bool DirAccessJAndroid::dir_exists(String p_dir) { String sd; - - if (current_dir=="") - sd=p_dir; + if (current_dir == "") + sd = p_dir; else { if (p_dir.is_rel_path()) - sd=current_dir.plus_file(p_dir); + sd = current_dir.plus_file(p_dir); else - sd=fix_path(p_dir); + sd = fix_path(p_dir); } - String path=sd.simplify_path(); + String path = sd.simplify_path(); if (path.begins_with("/")) - path=path.substr(1,path.length()); + path = path.substr(1, path.length()); else if (path.begins_with("res://")) - path=path.substr(6,path.length()); + path = path.substr(6, path.length()); jstring js = env->NewStringUTF(path.utf8().get_data()); - int res = env->CallIntMethod(io,_dir_open,js); + int res = env->CallIntMethod(io, _dir_open, js); env->DeleteLocalRef(js); - if (res<=0) + if (res <= 0) return false; - env->CallVoidMethod(io,_dir_close,res); + env->CallVoidMethod(io, _dir_close, res); return true; } -Error DirAccessJAndroid::make_dir(String p_dir){ +Error DirAccessJAndroid::make_dir(String p_dir) { ERR_FAIL_V(ERR_UNAVAILABLE); } -Error DirAccessJAndroid::rename(String p_from, String p_to){ +Error DirAccessJAndroid::rename(String p_from, String p_to) { ERR_FAIL_V(ERR_UNAVAILABLE); } -Error DirAccessJAndroid::remove(String p_name){ +Error DirAccessJAndroid::remove(String p_name) { ERR_FAIL_V(ERR_UNAVAILABLE); } @@ -228,42 +220,39 @@ size_t DirAccessJAndroid::get_space_left() { return 0; } - -void DirAccessJAndroid::setup( jobject p_io) { - +void DirAccessJAndroid::setup(jobject p_io) { JNIEnv *env = ThreadAndroid::get_env(); - io=p_io; - __android_log_print(ANDROID_LOG_INFO,"godot","STEP7"); + io = p_io; + __android_log_print(ANDROID_LOG_INFO, "godot", "STEP7"); jclass c = env->GetObjectClass(io); cls = (jclass)env->NewGlobalRef(c); - __android_log_print(ANDROID_LOG_INFO,"godot","STEP8"); + __android_log_print(ANDROID_LOG_INFO, "godot", "STEP8"); _dir_open = env->GetMethodID(cls, "dir_open", "(Ljava/lang/String;)I"); - if(_dir_open != 0) { - __android_log_print(ANDROID_LOG_INFO,"godot","*******GOT METHOD _dir_open ok!!"); + if (_dir_open != 0) { + __android_log_print(ANDROID_LOG_INFO, "godot", "*******GOT METHOD _dir_open ok!!"); } _dir_next = env->GetMethodID(cls, "dir_next", "(I)Ljava/lang/String;"); - if(_dir_next != 0) { - __android_log_print(ANDROID_LOG_INFO,"godot","*******GOT METHOD _dir_next ok!!"); + if (_dir_next != 0) { + __android_log_print(ANDROID_LOG_INFO, "godot", "*******GOT METHOD _dir_next ok!!"); } _dir_close = env->GetMethodID(cls, "dir_close", "(I)V"); - if(_dir_close != 0) { - __android_log_print(ANDROID_LOG_INFO,"godot","*******GOT METHOD _dir_close ok!!"); + if (_dir_close != 0) { + __android_log_print(ANDROID_LOG_INFO, "godot", "*******GOT METHOD _dir_close ok!!"); } _dir_is_dir = env->GetMethodID(cls, "dir_is_dir", "(I)Z"); - if(_dir_is_dir != 0) { - __android_log_print(ANDROID_LOG_INFO,"godot","*******GOT METHOD _dir_is_dir ok!!"); + if (_dir_is_dir != 0) { + __android_log_print(ANDROID_LOG_INFO, "godot", "*******GOT METHOD _dir_is_dir ok!!"); } -// (*env)->CallVoidMethod(env,obj,aMethodID, myvar); + // (*env)->CallVoidMethod(env,obj,aMethodID, myvar); } - DirAccessJAndroid::DirAccessJAndroid() { - id=0; + id = 0; } DirAccessJAndroid::~DirAccessJAndroid() { diff --git a/platform/android/dir_access_jandroid.h b/platform/android/dir_access_jandroid.h index bfd7912aa..237791423 100644 --- a/platform/android/dir_access_jandroid.h +++ b/platform/android/dir_access_jandroid.h @@ -31,13 +31,11 @@ #ifndef ANDROID_NATIVE_ACTIVITY - #include "java_glue.h" #include "os/dir_access.h" #include <stdio.h> - -class DirAccessJAndroid : public DirAccess { +class DirAccessJAndroid : public DirAccess { //AAssetDir* aad; @@ -57,7 +55,6 @@ class DirAccessJAndroid : public DirAccess { static DirAccess *create_fs(); public: - virtual bool list_dir_begin(); ///< This starts dir listing virtual String get_next(); virtual bool current_is_dir() const; @@ -70,7 +67,6 @@ public: virtual Error change_dir(String p_dir); ///< can be relative or absolute, return false on success virtual String get_current_dir(); ///< return current dir location - virtual bool file_exists(String p_file); virtual bool dir_exists(String p_dir); @@ -82,8 +78,7 @@ public: //virtual FileType get_file_type() const; size_t get_space_left(); - - static void setup( jobject io); + static void setup(jobject io); DirAccessJAndroid(); ~DirAccessJAndroid(); diff --git a/platform/android/export/export.cpp b/platform/android/export/export.cpp index c754fb994..604b99bab 100644 --- a/platform/android/export/export.cpp +++ b/platform/android/export/export.cpp @@ -26,180 +26,179 @@ /* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ -#include "version.h" #include "export.h" -#include "editor/editor_settings.h" #include "editor/editor_import_export.h" #include "editor/editor_node.h" -#include "io/zip_io.h" -#include "io/marshalls.h" +#include "editor/editor_settings.h" #include "globals.h" +#include "io/marshalls.h" +#include "io/zip_io.h" #include "os/file_access.h" #include "os/os.h" #include "platform/android/logo.h" +#include "version.h" #include <string.h> - -static const char* android_perms[]={ -"ACCESS_CHECKIN_PROPERTIES", -"ACCESS_COARSE_LOCATION", -"ACCESS_FINE_LOCATION", -"ACCESS_LOCATION_EXTRA_COMMANDS", -"ACCESS_MOCK_LOCATION", -"ACCESS_NETWORK_STATE", -"ACCESS_SURFACE_FLINGER", -"ACCESS_WIFI_STATE", -"ACCOUNT_MANAGER", -"ADD_VOICEMAIL", -"AUTHENTICATE_ACCOUNTS", -"BATTERY_STATS", -"BIND_ACCESSIBILITY_SERVICE", -"BIND_APPWIDGET", -"BIND_DEVICE_ADMIN", -"BIND_INPUT_METHOD", -"BIND_NFC_SERVICE", -"BIND_NOTIFICATION_LISTENER_SERVICE", -"BIND_PRINT_SERVICE", -"BIND_REMOTEVIEWS", -"BIND_TEXT_SERVICE", -"BIND_VPN_SERVICE", -"BIND_WALLPAPER", -"BLUETOOTH", -"BLUETOOTH_ADMIN", -"BLUETOOTH_PRIVILEGED", -"BRICK", -"BROADCAST_PACKAGE_REMOVED", -"BROADCAST_SMS", -"BROADCAST_STICKY", -"BROADCAST_WAP_PUSH", -"CALL_PHONE", -"CALL_PRIVILEGED", -"CAMERA", -"CAPTURE_AUDIO_OUTPUT", -"CAPTURE_SECURE_VIDEO_OUTPUT", -"CAPTURE_VIDEO_OUTPUT", -"CHANGE_COMPONENT_ENABLED_STATE", -"CHANGE_CONFIGURATION", -"CHANGE_NETWORK_STATE", -"CHANGE_WIFI_MULTICAST_STATE", -"CHANGE_WIFI_STATE", -"CLEAR_APP_CACHE", -"CLEAR_APP_USER_DATA", -"CONTROL_LOCATION_UPDATES", -"DELETE_CACHE_FILES", -"DELETE_PACKAGES", -"DEVICE_POWER", -"DIAGNOSTIC", -"DISABLE_KEYGUARD", -"DUMP", -"EXPAND_STATUS_BAR", -"FACTORY_TEST", -"FLASHLIGHT", -"FORCE_BACK", -"GET_ACCOUNTS", -"GET_PACKAGE_SIZE", -"GET_TASKS", -"GET_TOP_ACTIVITY_INFO", -"GLOBAL_SEARCH", -"HARDWARE_TEST", -"INJECT_EVENTS", -"INSTALL_LOCATION_PROVIDER", -"INSTALL_PACKAGES", -"INSTALL_SHORTCUT", -"INTERNAL_SYSTEM_WINDOW", -"INTERNET", -"KILL_BACKGROUND_PROCESSES", -"LOCATION_HARDWARE", -"MANAGE_ACCOUNTS", -"MANAGE_APP_TOKENS", -"MANAGE_DOCUMENTS", -"MASTER_CLEAR", -"MEDIA_CONTENT_CONTROL", -"MODIFY_AUDIO_SETTINGS", -"MODIFY_PHONE_STATE", -"MOUNT_FORMAT_FILESYSTEMS", -"MOUNT_UNMOUNT_FILESYSTEMS", -"NFC", -"PERSISTENT_ACTIVITY", -"PROCESS_OUTGOING_CALLS", -"READ_CALENDAR", -"READ_CALL_LOG", -"READ_CONTACTS", -"READ_EXTERNAL_STORAGE", -"READ_FRAME_BUFFER", -"READ_HISTORY_BOOKMARKS", -"READ_INPUT_STATE", -"READ_LOGS", -"READ_PHONE_STATE", -"READ_PROFILE", -"READ_SMS", -"READ_SOCIAL_STREAM", -"READ_SYNC_SETTINGS", -"READ_SYNC_STATS", -"READ_USER_DICTIONARY", -"REBOOT", -"RECEIVE_BOOT_COMPLETED", -"RECEIVE_MMS", -"RECEIVE_SMS", -"RECEIVE_WAP_PUSH", -"RECORD_AUDIO", -"REORDER_TASKS", -"RESTART_PACKAGES", -"SEND_RESPOND_VIA_MESSAGE", -"SEND_SMS", -"SET_ACTIVITY_WATCHER", -"SET_ALARM", -"SET_ALWAYS_FINISH", -"SET_ANIMATION_SCALE", -"SET_DEBUG_APP", -"SET_ORIENTATION", -"SET_POINTER_SPEED", -"SET_PREFERRED_APPLICATIONS", -"SET_PROCESS_LIMIT", -"SET_TIME", -"SET_TIME_ZONE", -"SET_WALLPAPER", -"SET_WALLPAPER_HINTS", -"SIGNAL_PERSISTENT_PROCESSES", -"STATUS_BAR", -"SUBSCRIBED_FEEDS_READ", -"SUBSCRIBED_FEEDS_WRITE", -"SYSTEM_ALERT_WINDOW", -"TRANSMIT_IR", -"UNINSTALL_SHORTCUT", -"UPDATE_DEVICE_STATS", -"USE_CREDENTIALS", -"USE_SIP", -"VIBRATE", -"WAKE_LOCK", -"WRITE_APN_SETTINGS", -"WRITE_CALENDAR", -"WRITE_CALL_LOG", -"WRITE_CONTACTS", -"WRITE_EXTERNAL_STORAGE", -"WRITE_GSERVICES", -"WRITE_HISTORY_BOOKMARKS", -"WRITE_PROFILE", -"WRITE_SECURE_SETTINGS", -"WRITE_SETTINGS", -"WRITE_SMS", -"WRITE_SOCIAL_STREAM", -"WRITE_SYNC_SETTINGS", -"WRITE_USER_DICTIONARY", -NULL}; +static const char *android_perms[] = { + "ACCESS_CHECKIN_PROPERTIES", + "ACCESS_COARSE_LOCATION", + "ACCESS_FINE_LOCATION", + "ACCESS_LOCATION_EXTRA_COMMANDS", + "ACCESS_MOCK_LOCATION", + "ACCESS_NETWORK_STATE", + "ACCESS_SURFACE_FLINGER", + "ACCESS_WIFI_STATE", + "ACCOUNT_MANAGER", + "ADD_VOICEMAIL", + "AUTHENTICATE_ACCOUNTS", + "BATTERY_STATS", + "BIND_ACCESSIBILITY_SERVICE", + "BIND_APPWIDGET", + "BIND_DEVICE_ADMIN", + "BIND_INPUT_METHOD", + "BIND_NFC_SERVICE", + "BIND_NOTIFICATION_LISTENER_SERVICE", + "BIND_PRINT_SERVICE", + "BIND_REMOTEVIEWS", + "BIND_TEXT_SERVICE", + "BIND_VPN_SERVICE", + "BIND_WALLPAPER", + "BLUETOOTH", + "BLUETOOTH_ADMIN", + "BLUETOOTH_PRIVILEGED", + "BRICK", + "BROADCAST_PACKAGE_REMOVED", + "BROADCAST_SMS", + "BROADCAST_STICKY", + "BROADCAST_WAP_PUSH", + "CALL_PHONE", + "CALL_PRIVILEGED", + "CAMERA", + "CAPTURE_AUDIO_OUTPUT", + "CAPTURE_SECURE_VIDEO_OUTPUT", + "CAPTURE_VIDEO_OUTPUT", + "CHANGE_COMPONENT_ENABLED_STATE", + "CHANGE_CONFIGURATION", + "CHANGE_NETWORK_STATE", + "CHANGE_WIFI_MULTICAST_STATE", + "CHANGE_WIFI_STATE", + "CLEAR_APP_CACHE", + "CLEAR_APP_USER_DATA", + "CONTROL_LOCATION_UPDATES", + "DELETE_CACHE_FILES", + "DELETE_PACKAGES", + "DEVICE_POWER", + "DIAGNOSTIC", + "DISABLE_KEYGUARD", + "DUMP", + "EXPAND_STATUS_BAR", + "FACTORY_TEST", + "FLASHLIGHT", + "FORCE_BACK", + "GET_ACCOUNTS", + "GET_PACKAGE_SIZE", + "GET_TASKS", + "GET_TOP_ACTIVITY_INFO", + "GLOBAL_SEARCH", + "HARDWARE_TEST", + "INJECT_EVENTS", + "INSTALL_LOCATION_PROVIDER", + "INSTALL_PACKAGES", + "INSTALL_SHORTCUT", + "INTERNAL_SYSTEM_WINDOW", + "INTERNET", + "KILL_BACKGROUND_PROCESSES", + "LOCATION_HARDWARE", + "MANAGE_ACCOUNTS", + "MANAGE_APP_TOKENS", + "MANAGE_DOCUMENTS", + "MASTER_CLEAR", + "MEDIA_CONTENT_CONTROL", + "MODIFY_AUDIO_SETTINGS", + "MODIFY_PHONE_STATE", + "MOUNT_FORMAT_FILESYSTEMS", + "MOUNT_UNMOUNT_FILESYSTEMS", + "NFC", + "PERSISTENT_ACTIVITY", + "PROCESS_OUTGOING_CALLS", + "READ_CALENDAR", + "READ_CALL_LOG", + "READ_CONTACTS", + "READ_EXTERNAL_STORAGE", + "READ_FRAME_BUFFER", + "READ_HISTORY_BOOKMARKS", + "READ_INPUT_STATE", + "READ_LOGS", + "READ_PHONE_STATE", + "READ_PROFILE", + "READ_SMS", + "READ_SOCIAL_STREAM", + "READ_SYNC_SETTINGS", + "READ_SYNC_STATS", + "READ_USER_DICTIONARY", + "REBOOT", + "RECEIVE_BOOT_COMPLETED", + "RECEIVE_MMS", + "RECEIVE_SMS", + "RECEIVE_WAP_PUSH", + "RECORD_AUDIO", + "REORDER_TASKS", + "RESTART_PACKAGES", + "SEND_RESPOND_VIA_MESSAGE", + "SEND_SMS", + "SET_ACTIVITY_WATCHER", + "SET_ALARM", + "SET_ALWAYS_FINISH", + "SET_ANIMATION_SCALE", + "SET_DEBUG_APP", + "SET_ORIENTATION", + "SET_POINTER_SPEED", + "SET_PREFERRED_APPLICATIONS", + "SET_PROCESS_LIMIT", + "SET_TIME", + "SET_TIME_ZONE", + "SET_WALLPAPER", + "SET_WALLPAPER_HINTS", + "SIGNAL_PERSISTENT_PROCESSES", + "STATUS_BAR", + "SUBSCRIBED_FEEDS_READ", + "SUBSCRIBED_FEEDS_WRITE", + "SYSTEM_ALERT_WINDOW", + "TRANSMIT_IR", + "UNINSTALL_SHORTCUT", + "UPDATE_DEVICE_STATS", + "USE_CREDENTIALS", + "USE_SIP", + "VIBRATE", + "WAKE_LOCK", + "WRITE_APN_SETTINGS", + "WRITE_CALENDAR", + "WRITE_CALL_LOG", + "WRITE_CONTACTS", + "WRITE_EXTERNAL_STORAGE", + "WRITE_GSERVICES", + "WRITE_HISTORY_BOOKMARKS", + "WRITE_PROFILE", + "WRITE_SECURE_SETTINGS", + "WRITE_SETTINGS", + "WRITE_SMS", + "WRITE_SOCIAL_STREAM", + "WRITE_SYNC_SETTINGS", + "WRITE_USER_DICTIONARY", + NULL +}; class EditorExportPlatformAndroid : public EditorExportPlatform { - OBJ_TYPE( EditorExportPlatformAndroid,EditorExportPlatform ); - + OBJ_TYPE(EditorExportPlatformAndroid, EditorExportPlatform); enum { - MAX_USER_PERMISSIONS=20, - SCREEN_SMALL=0, - SCREEN_NORMAL=1, - SCREEN_LARGE=2, - SCREEN_XLARGE=3, - SCREEN_MAX=4 + MAX_USER_PERMISSIONS = 20, + SCREEN_SMALL = 0, + SCREEN_NORMAL = 1, + SCREEN_LARGE = 2, + SCREEN_XLARGE = 3, + SCREEN_MAX = 4 }; String custom_release_package; @@ -251,103 +250,99 @@ class EditorExportPlatformAndroid : public EditorExportPlatform { volatile bool quit_request; - static void _device_poll_thread(void *ud); String get_package_name(); String get_project_name() const; - void _fix_manifest(Vector<uint8_t>& p_manifest, bool p_give_internet); - void _fix_resources(Vector<uint8_t>& p_manifest); - static Error save_apk_file(void *p_userdata,const String& p_path, const Vector<uint8_t>& p_data,int p_file,int p_total); - static bool _should_compress_asset(const String& p_path, const Vector<uint8_t>& p_data); + void _fix_manifest(Vector<uint8_t> &p_manifest, bool p_give_internet); + void _fix_resources(Vector<uint8_t> &p_manifest); + static Error save_apk_file(void *p_userdata, const String &p_path, const Vector<uint8_t> &p_data, int p_file, int p_total); + static bool _should_compress_asset(const String &p_path, const Vector<uint8_t> &p_data); protected: - - bool _set(const StringName& p_name, const Variant& p_value); - bool _get(const StringName& p_name,Variant &r_ret) const; - void _get_property_list( List<PropertyInfo> *p_list) const; + bool _set(const StringName &p_name, const Variant &p_value); + bool _get(const StringName &p_name, Variant &r_ret) const; + void _get_property_list(List<PropertyInfo> *p_list) const; public: - virtual String get_name() const { return "Android"; } virtual ImageCompression get_image_compression() const { return IMAGE_COMPRESSION_ETC1; } virtual Ref<Texture> get_logo() const { return logo; } - virtual bool poll_devices(); virtual int get_device_count() const; virtual String get_device_name(int p_device) const; virtual String get_device_info(int p_device) const; - virtual Error run(int p_device,int p_flags=0); + virtual Error run(int p_device, int p_flags = 0); virtual bool requires_password(bool p_debug) const { return !p_debug; } virtual String get_binary_extension() const { return "apk"; } - virtual Error export_project(const String& p_path, bool p_debug, int p_flags=0); + virtual Error export_project(const String &p_path, bool p_debug, int p_flags = 0); - virtual bool can_export(String *r_error=NULL) const; + virtual bool can_export(String *r_error = NULL) const; EditorExportPlatformAndroid(); ~EditorExportPlatformAndroid(); }; -bool EditorExportPlatformAndroid::_set(const StringName& p_name, const Variant& p_value) { +bool EditorExportPlatformAndroid::_set(const StringName &p_name, const Variant &p_value) { - String n=p_name; + String n = p_name; - if (n=="one_click_deploy/clear_previous_install") - remove_prev=p_value; - else if (n=="custom_package/debug") - custom_debug_package=p_value; - else if (n=="custom_package/release") - custom_release_package=p_value; - else if (n=="version/code") - version_code=p_value; - else if (n=="version/name") - version_name=p_value; - else if (n=="command_line/extra_args") - cmdline=p_value; - else if (n=="package/unique_name") - package=p_value; - else if (n=="package/name") - name=p_value; - else if (n=="package/icon") - icon=p_value; - else if (n=="package/signed") - _signed=p_value; - else if (n=="architecture/arm") - export_arm=p_value; - else if (n=="architecture/x86") - export_x86=p_value; - else if (n=="screen/use_32_bits_view") - use_32_fb=p_value; - else if (n=="screen/immersive_mode") - immersive=p_value; - else if (n=="screen/orientation") - orientation=p_value; - else if (n=="screen/support_small") - screen_support[SCREEN_SMALL]=p_value; - else if (n=="screen/support_normal") - screen_support[SCREEN_NORMAL]=p_value; - else if (n=="screen/support_large") - screen_support[SCREEN_LARGE]=p_value; - else if (n=="screen/support_xlarge") - screen_support[SCREEN_XLARGE]=p_value; - else if (n=="keystore/release") - release_keystore=p_value; - else if (n=="keystore/release_user") - release_username=p_value; - else if (n=="keystore/release_password") - release_password=p_value; - else if (n=="apk_expansion/enable") - apk_expansion=p_value; - else if (n=="apk_expansion/SALT") - apk_expansion_salt=p_value; - else if (n=="apk_expansion/public_key") - apk_expansion_pkey=p_value; + if (n == "one_click_deploy/clear_previous_install") + remove_prev = p_value; + else if (n == "custom_package/debug") + custom_debug_package = p_value; + else if (n == "custom_package/release") + custom_release_package = p_value; + else if (n == "version/code") + version_code = p_value; + else if (n == "version/name") + version_name = p_value; + else if (n == "command_line/extra_args") + cmdline = p_value; + else if (n == "package/unique_name") + package = p_value; + else if (n == "package/name") + name = p_value; + else if (n == "package/icon") + icon = p_value; + else if (n == "package/signed") + _signed = p_value; + else if (n == "architecture/arm") + export_arm = p_value; + else if (n == "architecture/x86") + export_x86 = p_value; + else if (n == "screen/use_32_bits_view") + use_32_fb = p_value; + else if (n == "screen/immersive_mode") + immersive = p_value; + else if (n == "screen/orientation") + orientation = p_value; + else if (n == "screen/support_small") + screen_support[SCREEN_SMALL] = p_value; + else if (n == "screen/support_normal") + screen_support[SCREEN_NORMAL] = p_value; + else if (n == "screen/support_large") + screen_support[SCREEN_LARGE] = p_value; + else if (n == "screen/support_xlarge") + screen_support[SCREEN_XLARGE] = p_value; + else if (n == "keystore/release") + release_keystore = p_value; + else if (n == "keystore/release_user") + release_username = p_value; + else if (n == "keystore/release_password") + release_password = p_value; + else if (n == "apk_expansion/enable") + apk_expansion = p_value; + else if (n == "apk_expansion/SALT") + apk_expansion_salt = p_value; + else if (n == "apk_expansion/public_key") + apk_expansion_pkey = p_value; else if (n.begins_with("permissions/")) { - String what = n.get_slicec('/',1).to_upper(); + String what = n.get_slicec('/', 1).to_upper(); bool state = p_value; if (state) perms.insert(what); @@ -355,9 +350,9 @@ bool EditorExportPlatformAndroid::_set(const StringName& p_name, const Variant& perms.erase(what); } else if (n.begins_with("user_permissions/")) { - int which = n.get_slicec('/',1).to_int(); - ERR_FAIL_INDEX_V(which,MAX_USER_PERMISSIONS,false); - user_perms[which]=p_value; + int which = n.get_slicec('/', 1).to_int(); + ERR_FAIL_INDEX_V(which, MAX_USER_PERMISSIONS, false); + user_perms[which] = p_value; } else return false; @@ -365,159 +360,154 @@ bool EditorExportPlatformAndroid::_set(const StringName& p_name, const Variant& return true; } -bool EditorExportPlatformAndroid::_get(const StringName& p_name,Variant &r_ret) const{ +bool EditorExportPlatformAndroid::_get(const StringName &p_name, Variant &r_ret) const { - String n=p_name; - if (n=="one_click_deploy/clear_previous_install") - r_ret=remove_prev; - else if (n=="custom_package/debug") - r_ret=custom_debug_package; - else if (n=="custom_package/release") - r_ret=custom_release_package; - else if (n=="version/code") - r_ret=version_code; - else if (n=="version/name") - r_ret=version_name; - else if (n=="command_line/extra_args") - r_ret=cmdline; - else if (n=="package/unique_name") - r_ret=package; - else if (n=="package/name") - r_ret=name; - else if (n=="package/icon") - r_ret=icon; - else if (n=="package/signed") - r_ret=_signed; - else if (n=="architecture/arm") - r_ret=export_arm; - else if (n=="architecture/x86") - r_ret=export_x86; - else if (n=="screen/use_32_bits_view") - r_ret=use_32_fb; - else if (n=="screen/immersive_mode") - r_ret=immersive; - else if (n=="screen/orientation") - r_ret=orientation; - else if (n=="screen/support_small") - r_ret=screen_support[SCREEN_SMALL]; - else if (n=="screen/support_normal") - r_ret=screen_support[SCREEN_NORMAL]; - else if (n=="screen/support_large") - r_ret=screen_support[SCREEN_LARGE]; - else if (n=="screen/support_xlarge") - r_ret=screen_support[SCREEN_XLARGE]; - else if (n=="keystore/release") - r_ret=release_keystore; - else if (n=="keystore/release_user") - r_ret=release_username; - else if (n=="keystore/release_password") - r_ret=release_password; - else if (n=="apk_expansion/enable") - r_ret=apk_expansion; - else if (n=="apk_expansion/SALT") - r_ret=apk_expansion_salt; - else if (n=="apk_expansion/public_key") - r_ret=apk_expansion_pkey; + String n = p_name; + if (n == "one_click_deploy/clear_previous_install") + r_ret = remove_prev; + else if (n == "custom_package/debug") + r_ret = custom_debug_package; + else if (n == "custom_package/release") + r_ret = custom_release_package; + else if (n == "version/code") + r_ret = version_code; + else if (n == "version/name") + r_ret = version_name; + else if (n == "command_line/extra_args") + r_ret = cmdline; + else if (n == "package/unique_name") + r_ret = package; + else if (n == "package/name") + r_ret = name; + else if (n == "package/icon") + r_ret = icon; + else if (n == "package/signed") + r_ret = _signed; + else if (n == "architecture/arm") + r_ret = export_arm; + else if (n == "architecture/x86") + r_ret = export_x86; + else if (n == "screen/use_32_bits_view") + r_ret = use_32_fb; + else if (n == "screen/immersive_mode") + r_ret = immersive; + else if (n == "screen/orientation") + r_ret = orientation; + else if (n == "screen/support_small") + r_ret = screen_support[SCREEN_SMALL]; + else if (n == "screen/support_normal") + r_ret = screen_support[SCREEN_NORMAL]; + else if (n == "screen/support_large") + r_ret = screen_support[SCREEN_LARGE]; + else if (n == "screen/support_xlarge") + r_ret = screen_support[SCREEN_XLARGE]; + else if (n == "keystore/release") + r_ret = release_keystore; + else if (n == "keystore/release_user") + r_ret = release_username; + else if (n == "keystore/release_password") + r_ret = release_password; + else if (n == "apk_expansion/enable") + r_ret = apk_expansion; + else if (n == "apk_expansion/SALT") + r_ret = apk_expansion_salt; + else if (n == "apk_expansion/public_key") + r_ret = apk_expansion_pkey; else if (n.begins_with("permissions/")) { - String what = n.get_slicec('/',1).to_upper(); + String what = n.get_slicec('/', 1).to_upper(); r_ret = perms.has(what); } else if (n.begins_with("user_permissions/")) { - int which = n.get_slicec('/',1).to_int(); - ERR_FAIL_INDEX_V(which,MAX_USER_PERMISSIONS,false); - r_ret=user_perms[which]; + int which = n.get_slicec('/', 1).to_int(); + ERR_FAIL_INDEX_V(which, MAX_USER_PERMISSIONS, false); + r_ret = user_perms[which]; } else return false; return true; } -void EditorExportPlatformAndroid::_get_property_list( List<PropertyInfo> *p_list) const{ +void EditorExportPlatformAndroid::_get_property_list(List<PropertyInfo> *p_list) const { - p_list->push_back( PropertyInfo( Variant::BOOL, "one_click_deploy/clear_previous_install")); - p_list->push_back( PropertyInfo( Variant::STRING, "custom_package/debug", PROPERTY_HINT_GLOBAL_FILE,"apk")); - p_list->push_back( PropertyInfo( Variant::STRING, "custom_package/release", PROPERTY_HINT_GLOBAL_FILE,"apk")); - p_list->push_back( PropertyInfo( Variant::STRING, "command_line/extra_args")); - p_list->push_back( PropertyInfo( Variant::INT, "version/code", PROPERTY_HINT_RANGE,"1,65535,1")); - p_list->push_back( PropertyInfo( Variant::STRING, "version/name") ); - p_list->push_back( PropertyInfo( Variant::STRING, "package/unique_name") ); - p_list->push_back( PropertyInfo( Variant::STRING, "package/name") ); - p_list->push_back( PropertyInfo( Variant::STRING, "package/icon",PROPERTY_HINT_FILE,"png") ); - p_list->push_back( PropertyInfo( Variant::BOOL, "package/signed") ); - p_list->push_back( PropertyInfo( Variant::BOOL, "architecture/arm") ); - p_list->push_back( PropertyInfo( Variant::BOOL, "architecture/x86") ); - p_list->push_back( PropertyInfo( Variant::BOOL, "screen/use_32_bits_view") ); - p_list->push_back( PropertyInfo( Variant::BOOL, "screen/immersive_mode") ); - p_list->push_back( PropertyInfo( Variant::INT, "screen/orientation",PROPERTY_HINT_ENUM,"Landscape,Portrait") ); - p_list->push_back( PropertyInfo( Variant::BOOL, "screen/support_small") ); - p_list->push_back( PropertyInfo( Variant::BOOL, "screen/support_normal") ); - p_list->push_back( PropertyInfo( Variant::BOOL, "screen/support_large") ); - p_list->push_back( PropertyInfo( Variant::BOOL, "screen/support_xlarge") ); - p_list->push_back( PropertyInfo( Variant::STRING, "keystore/release",PROPERTY_HINT_GLOBAL_FILE,"keystore") ); - p_list->push_back( PropertyInfo( Variant::STRING, "keystore/release_user" ) ); - p_list->push_back( PropertyInfo( Variant::STRING, "keystore/release_password" ) ); - p_list->push_back( PropertyInfo( Variant::BOOL, "apk_expansion/enable" ) ); - p_list->push_back( PropertyInfo( Variant::STRING, "apk_expansion/SALT" ) ); - p_list->push_back( PropertyInfo( Variant::STRING, "apk_expansion/public_key",PROPERTY_HINT_MULTILINE_TEXT ) ); + p_list->push_back(PropertyInfo(Variant::BOOL, "one_click_deploy/clear_previous_install")); + p_list->push_back(PropertyInfo(Variant::STRING, "custom_package/debug", PROPERTY_HINT_GLOBAL_FILE, "apk")); + p_list->push_back(PropertyInfo(Variant::STRING, "custom_package/release", PROPERTY_HINT_GLOBAL_FILE, "apk")); + p_list->push_back(PropertyInfo(Variant::STRING, "command_line/extra_args")); + p_list->push_back(PropertyInfo(Variant::INT, "version/code", PROPERTY_HINT_RANGE, "1,65535,1")); + p_list->push_back(PropertyInfo(Variant::STRING, "version/name")); + p_list->push_back(PropertyInfo(Variant::STRING, "package/unique_name")); + p_list->push_back(PropertyInfo(Variant::STRING, "package/name")); + p_list->push_back(PropertyInfo(Variant::STRING, "package/icon", PROPERTY_HINT_FILE, "png")); + p_list->push_back(PropertyInfo(Variant::BOOL, "package/signed")); + p_list->push_back(PropertyInfo(Variant::BOOL, "architecture/arm")); + p_list->push_back(PropertyInfo(Variant::BOOL, "architecture/x86")); + p_list->push_back(PropertyInfo(Variant::BOOL, "screen/use_32_bits_view")); + p_list->push_back(PropertyInfo(Variant::BOOL, "screen/immersive_mode")); + p_list->push_back(PropertyInfo(Variant::INT, "screen/orientation", PROPERTY_HINT_ENUM, "Landscape,Portrait")); + p_list->push_back(PropertyInfo(Variant::BOOL, "screen/support_small")); + p_list->push_back(PropertyInfo(Variant::BOOL, "screen/support_normal")); + p_list->push_back(PropertyInfo(Variant::BOOL, "screen/support_large")); + p_list->push_back(PropertyInfo(Variant::BOOL, "screen/support_xlarge")); + p_list->push_back(PropertyInfo(Variant::STRING, "keystore/release", PROPERTY_HINT_GLOBAL_FILE, "keystore")); + p_list->push_back(PropertyInfo(Variant::STRING, "keystore/release_user")); + p_list->push_back(PropertyInfo(Variant::STRING, "keystore/release_password")); + p_list->push_back(PropertyInfo(Variant::BOOL, "apk_expansion/enable")); + p_list->push_back(PropertyInfo(Variant::STRING, "apk_expansion/SALT")); + p_list->push_back(PropertyInfo(Variant::STRING, "apk_expansion/public_key", PROPERTY_HINT_MULTILINE_TEXT)); const char **perms = android_perms; - while(*perms) { + while (*perms) { - p_list->push_back( PropertyInfo( Variant::BOOL, "permissions/"+String(*perms).to_lower())); + p_list->push_back(PropertyInfo(Variant::BOOL, "permissions/" + String(*perms).to_lower())); perms++; } - for(int i=0;i<MAX_USER_PERMISSIONS;i++) { + for (int i = 0; i < MAX_USER_PERMISSIONS; i++) { - p_list->push_back( PropertyInfo( Variant::STRING, "user_permissions/"+itos(i))); + p_list->push_back(PropertyInfo(Variant::STRING, "user_permissions/" + itos(i))); } //p_list->push_back( PropertyInfo( Variant::INT, "resources/pack_mode", PROPERTY_HINT_ENUM,"Copy,Single Exec.,Pack (.pck),Bundles (Optical)")); - } +static String _parse_string(const uint8_t *p_bytes, bool p_utf8) { -static String _parse_string(const uint8_t *p_bytes,bool p_utf8) { - - uint32_t offset=0; + uint32_t offset = 0; uint32_t len = decode_uint16(&p_bytes[offset]); if (p_utf8) { //don't know how to read extended utf8, this will have to be for now - len>>=8; - + len >>= 8; } - offset+=2; + offset += 2; //printf("len %i, unicode: %i\n",len,int(p_utf8)); if (p_utf8) { Vector<uint8_t> str8; - str8.resize(len+1); - for(int i=0;i<len;i++) { - str8[i]=p_bytes[offset+i]; + str8.resize(len + 1); + for (int i = 0; i < len; i++) { + str8[i] = p_bytes[offset + i]; } - str8[len]=0; + str8[len] = 0; String str; - str.parse_utf8((const char*)str8.ptr()); + str.parse_utf8((const char *)str8.ptr()); return str; } else { String str; - for(int i=0;i<len;i++) { - CharType c = decode_uint16(&p_bytes[offset+i*2]); - if (c==0) + for (int i = 0; i < len; i++) { + CharType c = decode_uint16(&p_bytes[offset + i * 2]); + if (c == 0) break; str += String::chr(c); } return str; } - } -void EditorExportPlatformAndroid::_fix_resources(Vector<uint8_t>& p_manifest) { - +void EditorExportPlatformAndroid::_fix_resources(Vector<uint8_t> &p_manifest) { const int UTF8_FLAG = 0x00000100; print_line("*******************GORRRGLE***********************"); @@ -535,24 +525,23 @@ void EditorExportPlatformAndroid::_fix_resources(Vector<uint8_t>& p_manifest) { //printf("stirng count: %i\n",string_count); //printf("flags: %x\n",string_flags); - for(int i=0;i<string_count;i++) { + for (int i = 0; i < string_count; i++) { - uint32_t offset = decode_uint32(&p_manifest[string_table_begins+i*4]); - offset+=string_table_begins+string_count*4; + uint32_t offset = decode_uint32(&p_manifest[string_table_begins + i * 4]); + offset += string_table_begins + string_count * 4; - String str = _parse_string(&p_manifest[offset],string_flags&UTF8_FLAG); + String str = _parse_string(&p_manifest[offset], string_flags & UTF8_FLAG); if (str.begins_with("godot-project-name")) { - - if (str=="godot-project-name") { + if (str == "godot-project-name") { //project name str = get_project_name(); } else { - String lang = str.substr(str.find_last("-")+1,str.length()).replace("-","_"); - String prop = "application/name_"+lang; + String lang = str.substr(str.find_last("-") + 1, str.length()).replace("-", "_"); + String prop = "application/name_" + lang; if (Globals::get_singleton()->has(prop)) { str = Globals::get_singleton()->get(prop); } else { @@ -562,84 +551,79 @@ void EditorExportPlatformAndroid::_fix_resources(Vector<uint8_t>& p_manifest) { } string_table.push_back(str); - } //write a new string table, but use 16 bits Vector<uint8_t> ret; - ret.resize(string_table_begins+string_table.size()*4); + ret.resize(string_table_begins + string_table.size() * 4); - for(int i=0;i<string_table_begins;i++) { + for (int i = 0; i < string_table_begins; i++) { - ret[i]=p_manifest[i]; + ret[i] = p_manifest[i]; } - int ofs=0; - for(int i=0;i<string_table.size();i++) { + int ofs = 0; + for (int i = 0; i < string_table.size(); i++) { - encode_uint32(ofs,&ret[string_table_begins+i*4]); - ofs+=string_table[i].length()*2+2+2; + encode_uint32(ofs, &ret[string_table_begins + i * 4]); + ofs += string_table[i].length() * 2 + 2 + 2; } - ret.resize(ret.size()+ofs); - uint8_t *chars=&ret[ret.size()-ofs]; - for(int i=0;i<string_table.size();i++) { + ret.resize(ret.size() + ofs); + uint8_t *chars = &ret[ret.size() - ofs]; + for (int i = 0; i < string_table.size(); i++) { String s = string_table[i]; - encode_uint16(s.length(),chars); - chars+=2; - for(int j=0;j<s.length();j++) { - encode_uint16(s[j],chars); - chars+=2; + encode_uint16(s.length(), chars); + chars += 2; + for (int j = 0; j < s.length(); j++) { + encode_uint16(s[j], chars); + chars += 2; } - encode_uint16(0,chars); - chars+=2; + encode_uint16(0, chars); + chars += 2; } //pad - while(ret.size()%4) + while (ret.size() % 4) ret.push_back(0); //change flags to not use utf8 - encode_uint32(string_flags&~0x100,&ret[28]); + encode_uint32(string_flags & ~0x100, &ret[28]); //change length - encode_uint32(ret.size()-12,&ret[16]); + encode_uint32(ret.size() - 12, &ret[16]); //append the rest... - int rest_from = 12+string_block_len; + int rest_from = 12 + string_block_len; int rest_to = ret.size(); int rest_len = (p_manifest.size() - rest_from); - ret.resize(ret.size() + (p_manifest.size() - rest_from) ); - for(int i=0;i<rest_len;i++) { - ret[rest_to+i]=p_manifest[rest_from+i]; + ret.resize(ret.size() + (p_manifest.size() - rest_from)); + for (int i = 0; i < rest_len; i++) { + ret[rest_to + i] = p_manifest[rest_from + i]; } //finally update the size - encode_uint32(ret.size(),&ret[4]); - + encode_uint32(ret.size(), &ret[4]); - p_manifest=ret; + p_manifest = ret; //printf("end\n"); } String EditorExportPlatformAndroid::get_project_name() const { String aname; - if (this->name!="") { - aname=this->name; + if (this->name != "") { + aname = this->name; } else { aname = Globals::get_singleton()->get("application/name"); - } - if (aname=="") { - aname=_MKSTR(VERSION_NAME); + if (aname == "") { + aname = _MKSTR(VERSION_NAME); } return aname; } - -void EditorExportPlatformAndroid::_fix_manifest(Vector<uint8_t>& p_manifest,bool p_give_internet) { - +void EditorExportPlatformAndroid::_fix_manifest(Vector<uint8_t> &p_manifest, bool p_give_internet) { const int CHUNK_AXML_FILE = 0x00080003; const int CHUNK_RESOURCEIDS = 0x00080180; @@ -653,14 +637,13 @@ void EditorExportPlatformAndroid::_fix_manifest(Vector<uint8_t>& p_manifest,bool Vector<String> string_table; - uint32_t ofs=0; - + uint32_t ofs = 0; uint32_t header = decode_uint32(&p_manifest[ofs]); - uint32_t filesize = decode_uint32(&p_manifest[ofs+4]); - ofs+=8; + uint32_t filesize = decode_uint32(&p_manifest[ofs + 4]); + ofs += 8; -// print_line("FILESIZE: "+itos(filesize)+" ACTUAL: "+itos(p_manifest.size())); + // print_line("FILESIZE: "+itos(filesize)+" ACTUAL: "+itos(p_manifest.size())); uint32_t string_count; uint32_t styles_count; @@ -672,111 +655,104 @@ void EditorExportPlatformAndroid::_fix_manifest(Vector<uint8_t>& p_manifest,bool uint32_t string_table_ends; Vector<uint8_t> stable_extra; - while(ofs < p_manifest.size()) { + while (ofs < p_manifest.size()) { uint32_t chunk = decode_uint32(&p_manifest[ofs]); - uint32_t size = decode_uint32(&p_manifest[ofs+4]); + uint32_t size = decode_uint32(&p_manifest[ofs + 4]); - - switch(chunk) { + switch (chunk) { case CHUNK_STRINGS: { + int iofs = ofs + 8; - int iofs=ofs+8; - - string_count=decode_uint32(&p_manifest[iofs]); - styles_count=decode_uint32(&p_manifest[iofs+4]); - uint32_t string_flags=decode_uint32(&p_manifest[iofs+8]); - string_data_offset=decode_uint32(&p_manifest[iofs+12]); - styles_offset=decode_uint32(&p_manifest[iofs+16]); -/* + string_count = decode_uint32(&p_manifest[iofs]); + styles_count = decode_uint32(&p_manifest[iofs + 4]); + uint32_t string_flags = decode_uint32(&p_manifest[iofs + 8]); + string_data_offset = decode_uint32(&p_manifest[iofs + 12]); + styles_offset = decode_uint32(&p_manifest[iofs + 16]); + /* printf("string count: %i\n",string_count); printf("flags: %i\n",string_flags); printf("sdata ofs: %i\n",string_data_offset); printf("styles ofs: %i\n",styles_offset); */ - uint32_t st_offset=iofs+20; + uint32_t st_offset = iofs + 20; string_table.resize(string_count); - uint32_t string_end=0; + uint32_t string_end = 0; - string_table_begins=st_offset; + string_table_begins = st_offset; + for (int i = 0; i < string_count; i++) { - for(int i=0;i<string_count;i++) { - - uint32_t string_at = decode_uint32(&p_manifest[st_offset+i*4]); - string_at+=st_offset+string_count*4; + uint32_t string_at = decode_uint32(&p_manifest[st_offset + i * 4]); + string_at += st_offset + string_count * 4; ERR_EXPLAIN("Unimplemented, can't read utf8 string table."); - ERR_FAIL_COND(string_flags&UTF8_FLAG); - - if (string_flags&UTF8_FLAG) { - + ERR_FAIL_COND(string_flags & UTF8_FLAG); + if (string_flags & UTF8_FLAG) { } else { uint32_t len = decode_uint16(&p_manifest[string_at]); Vector<CharType> ucstring; - ucstring.resize(len+1); - for(int j=0;j<len;j++) { - uint16_t c=decode_uint16(&p_manifest[string_at+2+2*j]); - ucstring[j]=c; + ucstring.resize(len + 1); + for (int j = 0; j < len; j++) { + uint16_t c = decode_uint16(&p_manifest[string_at + 2 + 2 * j]); + ucstring[j] = c; } - string_end=MAX(string_at+2+2*len,string_end); - ucstring[len]=0; - string_table[i]=ucstring.ptr(); + string_end = MAX(string_at + 2 + 2 * len, string_end); + ucstring[len] = 0; + string_table[i] = ucstring.ptr(); } - -// print_line("String "+itos(i)+": "+string_table[i]); + // print_line("String "+itos(i)+": "+string_table[i]); } - for(int i=string_end;i<(ofs+size);i++) { + for (int i = string_end; i < (ofs + size); i++) { stable_extra.push_back(p_manifest[i]); } -// printf("stable extra: %i\n",int(stable_extra.size())); - string_table_ends=ofs+size; + // printf("stable extra: %i\n",int(stable_extra.size())); + string_table_ends = ofs + size; -// print_line("STABLE SIZE: "+itos(size)+" ACTUAL: "+itos(string_table_ends)); + // print_line("STABLE SIZE: "+itos(size)+" ACTUAL: "+itos(string_table_ends)); } break; case CHUNK_XML_START_TAG: { - int iofs=ofs+8; - uint32_t line=decode_uint32(&p_manifest[iofs]); - uint32_t nspace=decode_uint32(&p_manifest[iofs+8]); - uint32_t name=decode_uint32(&p_manifest[iofs+12]); - uint32_t check=decode_uint32(&p_manifest[iofs+16]); + int iofs = ofs + 8; + uint32_t line = decode_uint32(&p_manifest[iofs]); + uint32_t nspace = decode_uint32(&p_manifest[iofs + 8]); + uint32_t name = decode_uint32(&p_manifest[iofs + 12]); + uint32_t check = decode_uint32(&p_manifest[iofs + 16]); - String tname=string_table[name]; + String tname = string_table[name]; -// printf("NSPACE: %i\n",nspace); + // printf("NSPACE: %i\n",nspace); //printf("NAME: %i (%s)\n",name,tname.utf8().get_data()); //printf("CHECK: %x\n",check); - uint32_t attrcount=decode_uint32(&p_manifest[iofs+20]); - iofs+=28; + uint32_t attrcount = decode_uint32(&p_manifest[iofs + 20]); + iofs += 28; //printf("ATTRCOUNT: %x\n",attrcount); - for(int i=0;i<attrcount;i++) { - uint32_t attr_nspace=decode_uint32(&p_manifest[iofs]); - uint32_t attr_name=decode_uint32(&p_manifest[iofs+4]); - uint32_t attr_value=decode_uint32(&p_manifest[iofs+8]); - uint32_t attr_flags=decode_uint32(&p_manifest[iofs+12]); - uint32_t attr_resid=decode_uint32(&p_manifest[iofs+16]); - + for (int i = 0; i < attrcount; i++) { + uint32_t attr_nspace = decode_uint32(&p_manifest[iofs]); + uint32_t attr_name = decode_uint32(&p_manifest[iofs + 4]); + uint32_t attr_value = decode_uint32(&p_manifest[iofs + 8]); + uint32_t attr_flags = decode_uint32(&p_manifest[iofs + 12]); + uint32_t attr_resid = decode_uint32(&p_manifest[iofs + 16]); String value; - if (attr_value!=0xFFFFFFFF) - value=string_table[attr_value]; + if (attr_value != 0xFFFFFFFF) + value = string_table[attr_value]; else - value="Res #"+itos(attr_resid); + value = "Res #" + itos(attr_resid); String attrname = string_table[attr_name]; String nspace; - if (attr_nspace!=0xFFFFFFFF) - nspace=string_table[attr_nspace]; + if (attr_nspace != 0xFFFFFFFF) + nspace = string_table[attr_nspace]; else - nspace=""; + nspace = ""; //printf("ATTR %i NSPACE: %i\n",i,attr_nspace); //printf("ATTR %i NAME: %i (%s)\n",i,attr_name,attrname.utf8().get_data()); @@ -785,34 +761,33 @@ void EditorExportPlatformAndroid::_fix_manifest(Vector<uint8_t>& p_manifest,bool //printf("ATTR %i RESID: %x\n",i,attr_resid); //replace project information - if (tname=="manifest" && attrname=="package") { + if (tname == "manifest" && attrname == "package") { print_line("FOUND package"); - string_table[attr_value]=get_package_name(); + string_table[attr_value] = get_package_name(); } //print_line("tname: "+tname); //print_line("nspace: "+nspace); //print_line("attrname: "+attrname); - if (tname=="manifest" && /*nspace=="android" &&*/ attrname=="versionCode") { + if (tname == "manifest" && /*nspace=="android" &&*/ attrname == "versionCode") { print_line("FOUND versionCode"); - encode_uint32(version_code,&p_manifest[iofs+16]); + encode_uint32(version_code, &p_manifest[iofs + 16]); } - - if (tname=="manifest" && /*nspace=="android" &&*/ attrname=="versionName") { + if (tname == "manifest" && /*nspace=="android" &&*/ attrname == "versionName") { print_line("FOUND versionName"); - if (attr_value==0xFFFFFFFF) { + if (attr_value == 0xFFFFFFFF) { WARN_PRINT("Version name in a resource, should be plaintext") } else - string_table[attr_value]=version_name; + string_table[attr_value] = version_name; } - if (tname=="activity" && /*nspace=="android" &&*/ attrname=="screenOrientation") { + if (tname == "activity" && /*nspace=="android" &&*/ attrname == "screenOrientation") { - encode_uint32(orientation==0?0:1,&p_manifest[iofs+16]); + encode_uint32(orientation == 0 ? 0 : 1, &p_manifest[iofs + 16]); /* print_line("FOUND screen orientation"); if (attr_value==0xFFFFFFFF) { @@ -822,58 +797,55 @@ void EditorExportPlatformAndroid::_fix_manifest(Vector<uint8_t>& p_manifest,bool }*/ } - if (tname=="uses-permission" && /*nspace=="android" &&*/ attrname=="name") { + if (tname == "uses-permission" && /*nspace=="android" &&*/ attrname == "name") { if (value.begins_with("godot.custom")) { - int which = value.get_slice(".",2).to_int(); - if (which>=0 && which<MAX_USER_PERMISSIONS && user_perms[which].strip_edges()!="") { + int which = value.get_slice(".", 2).to_int(); + if (which >= 0 && which < MAX_USER_PERMISSIONS && user_perms[which].strip_edges() != "") { - string_table[attr_value]=user_perms[which].strip_edges(); + string_table[attr_value] = user_perms[which].strip_edges(); } } else if (value.begins_with("godot.")) { - String perm = value.get_slice(".",1); + String perm = value.get_slice(".", 1); - if (perms.has(perm) || (p_give_internet && perm=="INTERNET")) { + if (perms.has(perm) || (p_give_internet && perm == "INTERNET")) { - print_line("PERM: "+perm); - string_table[attr_value]="android.permission."+perm; + print_line("PERM: " + perm); + string_table[attr_value] = "android.permission." + perm; } - } } - if (tname=="supports-screens" ) { + if (tname == "supports-screens") { - if (attrname=="smallScreens") { + if (attrname == "smallScreens") { - encode_uint32(screen_support[SCREEN_SMALL]?0xFFFFFFFF:0,&p_manifest[iofs+16]); + encode_uint32(screen_support[SCREEN_SMALL] ? 0xFFFFFFFF : 0, &p_manifest[iofs + 16]); - } else if (attrname=="normalScreens") { + } else if (attrname == "normalScreens") { - encode_uint32(screen_support[SCREEN_NORMAL]?0xFFFFFFFF:0,&p_manifest[iofs+16]); + encode_uint32(screen_support[SCREEN_NORMAL] ? 0xFFFFFFFF : 0, &p_manifest[iofs + 16]); - } else if (attrname=="largeScreens") { + } else if (attrname == "largeScreens") { - encode_uint32(screen_support[SCREEN_LARGE]?0xFFFFFFFF:0,&p_manifest[iofs+16]); + encode_uint32(screen_support[SCREEN_LARGE] ? 0xFFFFFFFF : 0, &p_manifest[iofs + 16]); - } else if (attrname=="xlargeScreens") { - - encode_uint32(screen_support[SCREEN_XLARGE]?0xFFFFFFFF:0,&p_manifest[iofs+16]); + } else if (attrname == "xlargeScreens") { + encode_uint32(screen_support[SCREEN_XLARGE] ? 0xFFFFFFFF : 0, &p_manifest[iofs + 16]); } } - - iofs+=20; + iofs += 20; } } break; } //printf("chunk %x: size: %d\n",chunk,size); - ofs+=size; + ofs += size; } //printf("end\n"); @@ -881,67 +853,59 @@ void EditorExportPlatformAndroid::_fix_manifest(Vector<uint8_t>& p_manifest,bool //create new andriodmanifest binary Vector<uint8_t> ret; - ret.resize(string_table_begins+string_table.size()*4); + ret.resize(string_table_begins + string_table.size() * 4); - for(int i=0;i<string_table_begins;i++) { + for (int i = 0; i < string_table_begins; i++) { - ret[i]=p_manifest[i]; + ret[i] = p_manifest[i]; } - ofs=0; - for(int i=0;i<string_table.size();i++) { + ofs = 0; + for (int i = 0; i < string_table.size(); i++) { - encode_uint32(ofs,&ret[string_table_begins+i*4]); - ofs+=string_table[i].length()*2+2+2; + encode_uint32(ofs, &ret[string_table_begins + i * 4]); + ofs += string_table[i].length() * 2 + 2 + 2; //print_line("ofs: "+itos(i)+": "+itos(ofs)); } - ret.resize(ret.size()+ofs); - uint8_t *chars=&ret[ret.size()-ofs]; - for(int i=0;i<string_table.size();i++) { + ret.resize(ret.size() + ofs); + uint8_t *chars = &ret[ret.size() - ofs]; + for (int i = 0; i < string_table.size(); i++) { String s = string_table[i]; //print_line("savint string :"+s); - encode_uint16(s.length(),chars); - chars+=2; - for(int j=0;j<s.length();j++) { //include zero? - encode_uint16(s[j],chars); - chars+=2; + encode_uint16(s.length(), chars); + chars += 2; + for (int j = 0; j < s.length(); j++) { //include zero? + encode_uint16(s[j], chars); + chars += 2; } - encode_uint16(0,chars); - chars+=2; - + encode_uint16(0, chars); + chars += 2; } - - for(int i=0;i<stable_extra.size();i++) { + for (int i = 0; i < stable_extra.size(); i++) { ret.push_back(stable_extra[i]); } - while(ret.size()%4) + while (ret.size() % 4) ret.push_back(0); + uint32_t new_stable_end = ret.size(); - uint32_t new_stable_end=ret.size(); - - uint32_t extra = (p_manifest.size()-string_table_ends); + uint32_t extra = (p_manifest.size() - string_table_ends); ret.resize(new_stable_end + extra); - for(int i=0;i<extra;i++) - ret[new_stable_end+i]=p_manifest[string_table_ends+i]; + for (int i = 0; i < extra; i++) + ret[new_stable_end + i] = p_manifest[string_table_ends + i]; - while(ret.size()%4) + while (ret.size() % 4) ret.push_back(0); - encode_uint32(ret.size(),&ret[4]); //update new file size + encode_uint32(ret.size(), &ret[4]); //update new file size - encode_uint32(new_stable_end-8,&ret[12]); //update new string table size + encode_uint32(new_stable_end - 8, &ret[12]); //update new string table size //print_line("file size: "+itos(ret.size())); - p_manifest=ret; - - - - - + p_manifest = ret; #if 0 uint32_t header[9]; @@ -972,39 +936,33 @@ void EditorExportPlatformAndroid::_fix_manifest(Vector<uint8_t>& p_manifest,bool string_table[i]=ucstring.ptr(); } - #endif - } +Error EditorExportPlatformAndroid::save_apk_file(void *p_userdata, const String &p_path, const Vector<uint8_t> &p_data, int p_file, int p_total) { - -Error EditorExportPlatformAndroid::save_apk_file(void *p_userdata,const String& p_path, const Vector<uint8_t>& p_data,int p_file,int p_total) { - - APKExportData *ed=(APKExportData*)p_userdata; - String dst_path=p_path; - dst_path=dst_path.replace_first("res://","assets/"); + APKExportData *ed = (APKExportData *)p_userdata; + String dst_path = p_path; + dst_path = dst_path.replace_first("res://", "assets/"); zipOpenNewFileInZip(ed->apk, - dst_path.utf8().get_data(), - NULL, - NULL, - 0, - NULL, - 0, - NULL, - _should_compress_asset(p_path,p_data) ? Z_DEFLATED : 0, - Z_DEFAULT_COMPRESSION); - + dst_path.utf8().get_data(), + NULL, + NULL, + 0, + NULL, + 0, + NULL, + _should_compress_asset(p_path, p_data) ? Z_DEFLATED : 0, + Z_DEFAULT_COMPRESSION); - zipWriteInFileInZip(ed->apk,p_data.ptr(),p_data.size()); + zipWriteInFileInZip(ed->apk, p_data.ptr(), p_data.size()); zipCloseFileInZip(ed->apk); - ed->ep->step("File: "+p_path,3+p_file*100/p_total); + ed->ep->step("File: " + p_path, 3 + p_file * 100 / p_total); return OK; - } -bool EditorExportPlatformAndroid::_should_compress_asset(const String& p_path, const Vector<uint8_t>& p_data) { +bool EditorExportPlatformAndroid::_should_compress_asset(const String &p_path, const Vector<uint8_t> &p_data) { /* * By not compressing files with little or not benefit in doing so, @@ -1015,7 +973,7 @@ bool EditorExportPlatformAndroid::_should_compress_asset(const String& p_path, c // -- Unconditional uncompress to mimic AAPT plus some other - static const char* unconditional_compress_ext[] = { + static const char *unconditional_compress_ext[] = { // From https://github.com/android/platform_frameworks_base/blob/master/tools/aapt/Package.cpp // These formats are already compressed, or don't compress well: ".jpg", ".jpeg", ".png", ".gif", @@ -1031,7 +989,7 @@ bool EditorExportPlatformAndroid::_should_compress_asset(const String& p_path, c NULL }; - for (const char** ext=unconditional_compress_ext; *ext; ++ext) { + for (const char **ext = unconditional_compress_ext; *ext; ++ext) { if (p_path.to_lower().ends_with(String(*ext))) { return false; } @@ -1039,7 +997,7 @@ bool EditorExportPlatformAndroid::_should_compress_asset(const String& p_path, c // -- Compressed resource? - if (p_data.size() >= 4 && p_data[0]=='R' && p_data[1]=='S' && p_data[2]=='C' && p_data[3]=='C') { + if (p_data.size() >= 4 && p_data[0] == 'R' && p_data[1] == 'S' && p_data[2] == 'C' && p_data[3] == 'C') { // Already compressed return false; } @@ -1049,130 +1007,124 @@ bool EditorExportPlatformAndroid::_should_compress_asset(const String& p_path, c return true; } - - -Error EditorExportPlatformAndroid::export_project(const String& p_path, bool p_debug, int p_flags) { +Error EditorExportPlatformAndroid::export_project(const String &p_path, bool p_debug, int p_flags) { String src_apk; - EditorProgress ep("export","Exporting for Android",105); + EditorProgress ep("export", "Exporting for Android", 105); if (p_debug) - src_apk=custom_debug_package; + src_apk = custom_debug_package; else - src_apk=custom_release_package; + src_apk = custom_release_package; - if (src_apk=="") { + if (src_apk == "") { String err; if (p_debug) { - src_apk=find_export_template("android_debug.apk", &err); + src_apk = find_export_template("android_debug.apk", &err); } else { - src_apk=find_export_template("android_release.apk", &err); + src_apk = find_export_template("android_release.apk", &err); } - if (src_apk=="") { + if (src_apk == "") { EditorNode::add_io_error(err); return ERR_FILE_NOT_FOUND; } } - FileAccess *src_f=NULL; + FileAccess *src_f = NULL; zlib_filefunc_def io = zipio_create_io_from_file(&src_f); - - - ep.step("Creating APK",0); + ep.step("Creating APK", 0); unzFile pkg = unzOpen2(src_apk.utf8().get_data(), &io); if (!pkg) { - EditorNode::add_io_error("Could not find template APK to export:\n"+src_apk); + EditorNode::add_io_error("Could not find template APK to export:\n" + src_apk); return ERR_FILE_NOT_FOUND; } ERR_FAIL_COND_V(!pkg, ERR_CANT_OPEN); int ret = unzGoToFirstFile(pkg); - zlib_filefunc_def io2=io; - FileAccess *dst_f=NULL; - io2.opaque=&dst_f; - String unaligned_path=EditorSettings::get_singleton()->get_settings_path()+"/tmp/tmpexport-unaligned.apk"; - zipFile unaligned_apk=zipOpen2(unaligned_path.utf8().get_data(),APPEND_STATUS_CREATE,NULL,&io2); - + zlib_filefunc_def io2 = io; + FileAccess *dst_f = NULL; + io2.opaque = &dst_f; + String unaligned_path = EditorSettings::get_singleton()->get_settings_path() + "/tmp/tmpexport-unaligned.apk"; + zipFile unaligned_apk = zipOpen2(unaligned_path.utf8().get_data(), APPEND_STATUS_CREATE, NULL, &io2); - while(ret==UNZ_OK) { + while (ret == UNZ_OK) { //get filename unz_file_info info; char fname[16384]; - ret = unzGetCurrentFileInfo(pkg,&info,fname,16384,NULL,0,NULL,0); + ret = unzGetCurrentFileInfo(pkg, &info, fname, 16384, NULL, 0, NULL, 0); - bool skip=false; + bool skip = false; - String file=fname; + String file = fname; Vector<uint8_t> data; data.resize(info.uncompressed_size); //read unzOpenCurrentFile(pkg); - unzReadCurrentFile(pkg,data.ptr(),data.size()); + unzReadCurrentFile(pkg, data.ptr(), data.size()); unzCloseCurrentFile(pkg); //write - if (file=="AndroidManifest.xml") { + if (file == "AndroidManifest.xml") { - _fix_manifest(data,p_flags&(EXPORT_DUMB_CLIENT|EXPORT_REMOTE_DEBUG)); + _fix_manifest(data, p_flags & (EXPORT_DUMB_CLIENT | EXPORT_REMOTE_DEBUG)); } - if (file=="resources.arsc") { + if (file == "resources.arsc") { _fix_resources(data); } - if (file=="res/drawable/icon.png") { - bool found=false; + if (file == "res/drawable/icon.png") { + bool found = false; - if (this->icon!="" && this->icon.ends_with(".png")) { + if (this->icon != "" && this->icon.ends_with(".png")) { - FileAccess *f = FileAccess::open(this->icon,FileAccess::READ); + FileAccess *f = FileAccess::open(this->icon, FileAccess::READ); if (f) { data.resize(f->get_len()); - f->get_buffer(data.ptr(),data.size()); + f->get_buffer(data.ptr(), data.size()); memdelete(f); - found=true; + found = true; } - } if (!found) { String appicon = Globals::get_singleton()->get("application/icon"); - if (appicon!="" && appicon.ends_with(".png")) { - FileAccess*f = FileAccess::open(appicon,FileAccess::READ); + if (appicon != "" && appicon.ends_with(".png")) { + FileAccess *f = FileAccess::open(appicon, FileAccess::READ); if (f) { data.resize(f->get_len()); - f->get_buffer(data.ptr(),data.size()); + f->get_buffer(data.ptr(), data.size()); memdelete(f); } } } } - if (file=="lib/x86/libgodot_android.so" && !export_x86) { - skip=true; + if (file == "lib/x86/libgodot_android.so" && !export_x86) { + skip = true; } if (file.match("lib/armeabi*/libgodot_android.so") && !export_arm) { - skip=true; + skip = true; } if (file.begins_with("META-INF") && _signed) { - skip=true; + skip = true; } - print_line("ADDING: "+file); + print_line("ADDING: " + file); if (!skip) { @@ -1180,37 +1132,36 @@ Error EditorExportPlatformAndroid::export_project(const String& p_path, bool p_d const bool uncompressed = info.compression_method == 0; zipOpenNewFileInZip(unaligned_apk, - file.utf8().get_data(), - NULL, - NULL, - 0, - NULL, - 0, - NULL, - uncompressed ? 0 : Z_DEFLATED, - Z_DEFAULT_COMPRESSION); + file.utf8().get_data(), + NULL, + NULL, + 0, + NULL, + 0, + NULL, + uncompressed ? 0 : Z_DEFLATED, + Z_DEFAULT_COMPRESSION); - zipWriteInFileInZip(unaligned_apk,data.ptr(),data.size()); + zipWriteInFileInZip(unaligned_apk, data.ptr(), data.size()); zipCloseFileInZip(unaligned_apk); } ret = unzGoToNextFile(pkg); } - - ep.step("Adding Files..",1); - Error err=OK; + ep.step("Adding Files..", 1); + Error err = OK; Vector<String> cl = cmdline.strip_edges().split(" "); - for(int i=0;i<cl.size();i++) { - if (cl[i].strip_edges().length()==0) { + for (int i = 0; i < cl.size(); i++) { + if (cl[i].strip_edges().length() == 0) { cl.remove(i); i--; } } - gen_export_flags(cl,p_flags); + gen_export_flags(cl, p_flags); - if (p_flags&EXPORT_DUMB_CLIENT) { + if (p_flags & EXPORT_DUMB_CLIENT) { /*String host = EditorSettings::get_singleton()->get("file_server/host"); int port = EditorSettings::get_singleton()->get("file_server/post"); @@ -1222,17 +1173,16 @@ Error EditorExportPlatformAndroid::export_project(const String& p_path, bool p_d cl.push_back(passwd); }*/ - } else { //all files if (apk_expansion) { - String apkfname="main."+itos(version_code)+"."+get_package_name()+".obb"; - String fullpath=p_path.get_base_dir().plus_file(apkfname); - FileAccess *pf = FileAccess::open(fullpath,FileAccess::WRITE); + String apkfname = "main." + itos(version_code) + "." + get_package_name() + ".obb"; + String fullpath = p_path.get_base_dir().plus_file(apkfname); + FileAccess *pf = FileAccess::open(fullpath, FileAccess::WRITE); if (!pf) { - EditorNode::add_io_error("Could not write expansion package file: "+apkfname); + EditorNode::add_io_error("Could not write expansion package file: " + apkfname); return OK; } err = save_pack(pf); @@ -1247,13 +1197,11 @@ Error EditorExportPlatformAndroid::export_project(const String& p_path, bool p_d } else { APKExportData ed; - ed.ep=&ep; - ed.apk=unaligned_apk; + ed.ep = &ep; + ed.apk = unaligned_apk; - err = export_project_files(save_apk_file,&ed,false); + err = export_project_files(save_apk_file, &ed, false); } - - } if (use_32_fb) @@ -1266,46 +1214,42 @@ Error EditorExportPlatformAndroid::export_project(const String& p_path, bool p_d //add comandline Vector<uint8_t> clf; clf.resize(4); - encode_uint32(cl.size(),&clf[0]); - for(int i=0;i<cl.size();i++) { + encode_uint32(cl.size(), &clf[0]); + for (int i = 0; i < cl.size(); i++) { CharString txt = cl[i].utf8(); int base = clf.size(); - clf.resize(base+4+txt.length()); - encode_uint32(txt.length(),&clf[base]); - copymem(&clf[base+4],txt.ptr(),txt.length()); - print_line(itos(i)+" param: "+cl[i]); + clf.resize(base + 4 + txt.length()); + encode_uint32(txt.length(), &clf[base]); + copymem(&clf[base + 4], txt.ptr(), txt.length()); + print_line(itos(i) + " param: " + cl[i]); } zipOpenNewFileInZip(unaligned_apk, - "assets/_cl_", - NULL, - NULL, - 0, - NULL, - 0, - NULL, - 0, // No compress (little size gain and potentially slower startup) - Z_DEFAULT_COMPRESSION); + "assets/_cl_", + NULL, + NULL, + 0, + NULL, + 0, + NULL, + 0, // No compress (little size gain and potentially slower startup) + Z_DEFAULT_COMPRESSION); - zipWriteInFileInZip(unaligned_apk,clf.ptr(),clf.size()); + zipWriteInFileInZip(unaligned_apk, clf.ptr(), clf.size()); zipCloseFileInZip(unaligned_apk); - } - zipClose(unaligned_apk,NULL); + zipClose(unaligned_apk, NULL); unzClose(pkg); if (err) { return err; } - - if (_signed) { - - String jarsigner=EditorSettings::get_singleton()->get("android/jarsigner"); + String jarsigner = EditorSettings::get_singleton()->get("android/jarsigner"); if (!FileAccess::exists(jarsigner)) { EditorNode::add_io_error("'jarsigner' could not be found.\nPlease supply a path in the editor settings.\nResulting apk is unsigned."); return OK; @@ -1315,19 +1259,18 @@ Error EditorExportPlatformAndroid::export_project(const String& p_path, bool p_d String password; String user; if (p_debug) { - keystore=EditorSettings::get_singleton()->get("android/debug_keystore"); - password=EditorSettings::get_singleton()->get("android/debug_keystore_pass"); - user=EditorSettings::get_singleton()->get("android/debug_keystore_user"); + keystore = EditorSettings::get_singleton()->get("android/debug_keystore"); + password = EditorSettings::get_singleton()->get("android/debug_keystore_pass"); + user = EditorSettings::get_singleton()->get("android/debug_keystore_user"); - ep.step("Signing Debug APK..",103); + ep.step("Signing Debug APK..", 103); } else { - keystore=release_keystore; - password=release_password; - user=release_username; - - ep.step("Signing Release APK..",103); + keystore = release_keystore; + password = release_password; + user = release_username; + ep.step("Signing Release APK..", 103); } if (!FileAccess::exists(keystore)) { @@ -1340,7 +1283,7 @@ Error EditorExportPlatformAndroid::export_project(const String& p_path, bool p_d args.push_back("SHA1"); args.push_back("-sigalg"); args.push_back("MD5withRSA"); - String tsa_url=EditorSettings::get_singleton()->get("android/timestamping_authority_url"); + String tsa_url = EditorSettings::get_singleton()->get("android/timestamping_authority_url"); if (tsa_url != "") { args.push_back("-tsa"); args.push_back(tsa_url); @@ -1353,34 +1296,31 @@ Error EditorExportPlatformAndroid::export_project(const String& p_path, bool p_d args.push_back(unaligned_path); args.push_back(user); int retval; - int err = OS::get_singleton()->execute(jarsigner,args,true,NULL,NULL,&retval); + int err = OS::get_singleton()->execute(jarsigner, args, true, NULL, NULL, &retval); if (retval) { - EditorNode::add_io_error("'jarsigner' returned with error #"+itos(retval)); + EditorNode::add_io_error("'jarsigner' returned with error #" + itos(retval)); return ERR_CANT_CREATE; } - ep.step("Verifying APK..",104); + ep.step("Verifying APK..", 104); args.clear(); args.push_back("-verify"); args.push_back(unaligned_path); args.push_back("-verbose"); - err = OS::get_singleton()->execute(jarsigner,args,true,NULL,NULL,&retval); + err = OS::get_singleton()->execute(jarsigner, args, true, NULL, NULL, &retval); if (retval) { EditorNode::add_io_error("'jarsigner' verification of APK failed. Make sure to use jarsigner from Java 6."); return ERR_CANT_CREATE; } - } - - // Let's zip-align (must be done after signing) static const int ZIP_ALIGNMENT = 4; - ep.step("Aligning APK..",105); + ep.step("Aligning APK..", 105); unzFile tmp_unaligned = unzOpen2(unaligned_path.utf8().get_data(), &io); if (!tmp_unaligned) { @@ -1392,25 +1332,25 @@ Error EditorExportPlatformAndroid::export_project(const String& p_path, bool p_d ERR_FAIL_COND_V(!tmp_unaligned, ERR_CANT_OPEN); ret = unzGoToFirstFile(tmp_unaligned); - io2=io; - dst_f=NULL; - io2.opaque=&dst_f; - zipFile final_apk=zipOpen2(p_path.utf8().get_data(),APPEND_STATUS_CREATE,NULL,&io2); + io2 = io; + dst_f = NULL; + io2.opaque = &dst_f; + zipFile final_apk = zipOpen2(p_path.utf8().get_data(), APPEND_STATUS_CREATE, NULL, &io2); // Take files from the unaligned APK and write them out to the aligned one // in raw mode, i.e. not uncompressing and recompressing, aligning them as needed, // following what is done in https://github.com/android/platform_build/blob/master/tools/zipalign/ZipAlign.cpp int bias = 0; - while(ret==UNZ_OK) { + while (ret == UNZ_OK) { unz_file_info info; memset(&info, 0, sizeof(info)); char fname[16384]; char extra[16384]; - ret = unzGetCurrentFileInfo(tmp_unaligned,&info,fname,16384,extra,16384-ZIP_ALIGNMENT,NULL,0); + ret = unzGetCurrentFileInfo(tmp_unaligned, &info, fname, 16384, extra, 16384 - ZIP_ALIGNMENT, NULL, 0); - String file=fname; + String file = fname; Vector<uint8_t> data; data.resize(info.compressed_size); @@ -1419,7 +1359,7 @@ Error EditorExportPlatformAndroid::export_project(const String& p_path, bool p_d int method, level; unzOpenCurrentFile2(tmp_unaligned, &method, &level, 1); // raw read long file_offset = unzGetCurrentFileZStreamPos64(tmp_unaligned); - unzReadCurrentFile(tmp_unaligned,data.ptr(),data.size()); + unzReadCurrentFile(tmp_unaligned, data.ptr(), data.size()); unzCloseCurrentFile(tmp_unaligned); // align @@ -1427,32 +1367,32 @@ Error EditorExportPlatformAndroid::export_project(const String& p_path, bool p_d if (!info.compression_method) { // Uncompressed file => Align long new_offset = file_offset + bias; - padding = (ZIP_ALIGNMENT - (new_offset % ZIP_ALIGNMENT)) % ZIP_ALIGNMENT; + padding = (ZIP_ALIGNMENT - (new_offset % ZIP_ALIGNMENT)) % ZIP_ALIGNMENT; } memset(extra + info.size_file_extra, 0, padding); // write zipOpenNewFileInZip2(final_apk, - file.utf8().get_data(), - NULL, - extra, - info.size_file_extra + padding, - NULL, - 0, - NULL, - method, - level, - 1); // raw write - zipWriteInFileInZip(final_apk,data.ptr(),data.size()); - zipCloseFileInZipRaw(final_apk,info.uncompressed_size,info.crc); + file.utf8().get_data(), + NULL, + extra, + info.size_file_extra + padding, + NULL, + 0, + NULL, + method, + level, + 1); // raw write + zipWriteInFileInZip(final_apk, data.ptr(), data.size()); + zipCloseFileInZipRaw(final_apk, info.uncompressed_size, info.crc); bias += padding; ret = unzGoToNextFile(tmp_unaligned); } - zipClose(final_apk,NULL); + zipClose(final_apk, NULL); unzClose(tmp_unaligned); if (err) { @@ -1460,86 +1400,82 @@ Error EditorExportPlatformAndroid::export_project(const String& p_path, bool p_d } return OK; - } - bool EditorExportPlatformAndroid::poll_devices() { - bool dc=devices_changed; - devices_changed=false; + bool dc = devices_changed; + devices_changed = false; return dc; } int EditorExportPlatformAndroid::get_device_count() const { device_lock->lock(); - int dc=devices.size(); + int dc = devices.size(); device_lock->unlock(); return dc; - } String EditorExportPlatformAndroid::get_device_name(int p_device) const { - ERR_FAIL_INDEX_V(p_device,devices.size(),""); + ERR_FAIL_INDEX_V(p_device, devices.size(), ""); device_lock->lock(); - String s=devices[p_device].name; + String s = devices[p_device].name; device_lock->unlock(); return s; } String EditorExportPlatformAndroid::get_device_info(int p_device) const { - ERR_FAIL_INDEX_V(p_device,devices.size(),""); + ERR_FAIL_INDEX_V(p_device, devices.size(), ""); device_lock->lock(); - String s=devices[p_device].description; + String s = devices[p_device].description; device_lock->unlock(); return s; } void EditorExportPlatformAndroid::_device_poll_thread(void *ud) { - EditorExportPlatformAndroid *ea=(EditorExportPlatformAndroid *)ud; - + EditorExportPlatformAndroid *ea = (EditorExportPlatformAndroid *)ud; - while(!ea->quit_request) { + while (!ea->quit_request) { - String adb=EditorSettings::get_singleton()->get("android/adb"); + String adb = EditorSettings::get_singleton()->get("android/adb"); if (FileAccess::exists(adb)) { String devices; List<String> args; args.push_back("devices"); int ec; - Error err = OS::get_singleton()->execute(adb,args,true,NULL,&devices,&ec); + Error err = OS::get_singleton()->execute(adb, args, true, NULL, &devices, &ec); Vector<String> ds = devices.split("\n"); Vector<String> ldevices; - for(int i=1;i<ds.size();i++) { + for (int i = 1; i < ds.size(); i++) { String d = ds[i]; int dpos = d.find("device"); - if (dpos==-1) + if (dpos == -1) continue; - d=d.substr(0,dpos).strip_edges(); - // print_line("found devuce: "+d); + d = d.substr(0, dpos).strip_edges(); + // print_line("found devuce: "+d); ldevices.push_back(d); } ea->device_lock->lock(); - bool different=false; + bool different = false; - if (devices.size()!=ldevices.size()) { + if (devices.size() != ldevices.size()) { - different=true; + different = true; } else { - for(int i=0;i<ea->devices.size();i++) { + for (int i = 0; i < ea->devices.size(); i++) { - if (ea->devices[i].id!=ldevices[i]) { - different=true; + if (ea->devices[i].id != ldevices[i]) { + different = true; break; } } @@ -1547,21 +1483,20 @@ void EditorExportPlatformAndroid::_device_poll_thread(void *ud) { if (different) { - Vector<Device> ndevices; - for(int i=0;i<ldevices.size();i++) { + for (int i = 0; i < ldevices.size(); i++) { Device d; - d.id=ldevices[i]; - for(int j=0;j<ea->devices.size();j++) { - if (ea->devices[j].id==ldevices[i]) { - d.description=ea->devices[j].description; - d.name=ea->devices[j].name; + d.id = ldevices[i]; + for (int j = 0; j < ea->devices.size(); j++) { + if (ea->devices[j].id == ldevices[i]) { + d.description = ea->devices[j].description; + d.name = ea->devices[j].name; } } - if (d.description=="") { + if (d.description == "") { //in the oven, request! args.clear(); args.push_back("-s"); @@ -1572,47 +1507,45 @@ void EditorExportPlatformAndroid::_device_poll_thread(void *ud) { int ec; String dp; - Error err = OS::get_singleton()->execute(adb,args,true,NULL,&dp,&ec); + Error err = OS::get_singleton()->execute(adb, args, true, NULL, &dp, &ec); Vector<String> props = dp.split("\n"); String vendor; String device; - d.description+"Device ID: "+d.id+"\n"; - for(int j=0;j<props.size();j++) { + d.description + "Device ID: " + d.id + "\n"; + for (int j = 0; j < props.size(); j++) { String p = props[j]; if (p.begins_with("ro.product.model=")) { - device=p.get_slice("=",1).strip_edges(); + device = p.get_slice("=", 1).strip_edges(); } else if (p.begins_with("ro.product.brand=")) { - vendor=p.get_slice("=",1).strip_edges().capitalize(); + vendor = p.get_slice("=", 1).strip_edges().capitalize(); } else if (p.begins_with("ro.build.display.id=")) { - d.description+="Build: "+p.get_slice("=",1).strip_edges()+"\n"; + d.description += "Build: " + p.get_slice("=", 1).strip_edges() + "\n"; } else if (p.begins_with("ro.build.version.release=")) { - d.description+="Release: "+p.get_slice("=",1).strip_edges()+"\n"; + d.description += "Release: " + p.get_slice("=", 1).strip_edges() + "\n"; } else if (p.begins_with("ro.product.cpu.abi=")) { - d.description+="CPU: "+p.get_slice("=",1).strip_edges()+"\n"; + d.description += "CPU: " + p.get_slice("=", 1).strip_edges() + "\n"; } else if (p.begins_with("ro.product.manufacturer=")) { - d.description+="Manufacturer: "+p.get_slice("=",1).strip_edges()+"\n"; + d.description += "Manufacturer: " + p.get_slice("=", 1).strip_edges() + "\n"; } else if (p.begins_with("ro.board.platform=")) { - d.description+="Chipset: "+p.get_slice("=",1).strip_edges()+"\n"; + d.description += "Chipset: " + p.get_slice("=", 1).strip_edges() + "\n"; } else if (p.begins_with("ro.opengles.version=")) { - uint32_t opengl = p.get_slice("=",1).to_int(); - d.description+="OpenGL: "+itos(opengl>>16)+"."+itos((opengl>>8)&0xFF)+"."+itos((opengl)&0xFF)+"\n"; + uint32_t opengl = p.get_slice("=", 1).to_int(); + d.description += "OpenGL: " + itos(opengl >> 16) + "." + itos((opengl >> 8) & 0xFF) + "." + itos((opengl)&0xFF) + "\n"; } } - d.name=vendor+" "+device; - // print_line("name: "+d.name); - // print_line("description: "+d.description); - + d.name = vendor + " " + device; + // print_line("name: "+d.name); + // print_line("description: "+d.description); } ndevices.push_back(d); - } - ea->devices=ndevices; - ea->devices_changed=true; + ea->devices = ndevices; + ea->devices_changed = true; } ea->device_lock->unlock(); @@ -1620,35 +1553,34 @@ void EditorExportPlatformAndroid::_device_poll_thread(void *ud) { uint64_t wait = 3000000; uint64_t time = OS::get_singleton()->get_ticks_usec(); - while(OS::get_singleton()->get_ticks_usec() - time < wait ) { + while (OS::get_singleton()->get_ticks_usec() - time < wait) { OS::get_singleton()->delay_usec(1000); if (ea->quit_request) break; } - } if (EditorSettings::get_singleton()->get("android/shutdown_adb_on_exit")) { - String adb=EditorSettings::get_singleton()->get("android/adb"); + String adb = EditorSettings::get_singleton()->get("android/adb"); if (!FileAccess::exists(adb)) { return; //adb not configured } List<String> args; args.push_back("kill-server"); - OS::get_singleton()->execute(adb,args,true); + OS::get_singleton()->execute(adb, args, true); }; } Error EditorExportPlatformAndroid::run(int p_device, int p_flags) { - ERR_FAIL_INDEX_V(p_device,devices.size(),ERR_INVALID_PARAMETER); + ERR_FAIL_INDEX_V(p_device, devices.size(), ERR_INVALID_PARAMETER); device_lock->lock(); - EditorProgress ep("run","Running on "+devices[p_device].name,3); + EditorProgress ep("run", "Running on " + devices[p_device].name, 3); - String adb=EditorSettings::get_singleton()->get("android/adb"); - if (adb=="") { + String adb = EditorSettings::get_singleton()->get("android/adb"); + if (adb == "") { EditorNode::add_io_error("ADB executable not configured in settings, can't run."); device_lock->unlock(); @@ -1656,17 +1588,16 @@ Error EditorExportPlatformAndroid::run(int p_device, int p_flags) { } //export_temp - ep.step("Exporting APK",0); + ep.step("Exporting APK", 0); - - bool use_adb_over_usb = bool(EDITOR_DEF("android/use_remote_debug_over_adb",true)); + bool use_adb_over_usb = bool(EDITOR_DEF("android/use_remote_debug_over_adb", true)); if (use_adb_over_usb) { - p_flags|=EXPORT_REMOTE_DEBUG_LOCALHOST; + p_flags |= EXPORT_REMOTE_DEBUG_LOCALHOST; } - String export_to=EditorSettings::get_singleton()->get_settings_path()+"/tmp/tmpexport.apk"; - Error err = export_project(export_to,true,p_flags); + String export_to = EditorSettings::get_singleton()->get_settings_path() + "/tmp/tmpexport.apk"; + Error err = export_project(export_to, true, p_flags); if (err) { device_lock->unlock(); return err; @@ -1676,16 +1607,16 @@ Error EditorExportPlatformAndroid::run(int p_device, int p_flags) { int rv; if (remove_prev) { - ep.step("Uninstalling..",1); + ep.step("Uninstalling..", 1); - print_line("Uninstalling previous version: "+devices[p_device].name); + print_line("Uninstalling previous version: " + devices[p_device].name); args.push_back("-s"); args.push_back(devices[p_device].id); args.push_back("uninstall"); args.push_back(get_package_name()); - err = OS::get_singleton()->execute(adb,args,true,NULL,NULL,&rv); + err = OS::get_singleton()->execute(adb, args, true, NULL, NULL, &rv); #if 0 if (err || rv!=0) { EditorNode::add_io_error("Could not install to device."); @@ -1695,8 +1626,8 @@ Error EditorExportPlatformAndroid::run(int p_device, int p_flags) { #endif } - print_line("Installing into device (please wait..): "+devices[p_device].name); - ep.step("Installing to Device (please wait..)..",2); + print_line("Installing into device (please wait..): " + devices[p_device].name); + ep.step("Installing to Device (please wait..)..", 2); args.clear(); args.push_back("-s"); @@ -1705,8 +1636,8 @@ Error EditorExportPlatformAndroid::run(int p_device, int p_flags) { args.push_back("-r"); args.push_back(export_to); - err = OS::get_singleton()->execute(adb,args,true,NULL,NULL,&rv); - if (err || rv!=0) { + err = OS::get_singleton()->execute(adb, args, true, NULL, NULL, &rv); + if (err || rv != 0) { EditorNode::add_io_error("Could not install to device."); device_lock->unlock(); return ERR_CANT_CREATE; @@ -1717,31 +1648,29 @@ Error EditorExportPlatformAndroid::run(int p_device, int p_flags) { args.clear(); args.push_back("reverse"); args.push_back("--remove-all"); - err = OS::get_singleton()->execute(adb,args,true,NULL,NULL,&rv); + err = OS::get_singleton()->execute(adb, args, true, NULL, NULL, &rv); int port = Globals::get_singleton()->get("debug/debug_port"); args.clear(); args.push_back("reverse"); - args.push_back("tcp:"+itos(port)); - args.push_back("tcp:"+itos(port)); + args.push_back("tcp:" + itos(port)); + args.push_back("tcp:" + itos(port)); - err = OS::get_singleton()->execute(adb,args,true,NULL,NULL,&rv); - print_line("Reverse result: "+itos(rv)); + err = OS::get_singleton()->execute(adb, args, true, NULL, NULL, &rv); + print_line("Reverse result: " + itos(rv)); int fs_port = EditorSettings::get_singleton()->get("file_server/port"); args.clear(); args.push_back("reverse"); - args.push_back("tcp:"+itos(fs_port)); - args.push_back("tcp:"+itos(fs_port)); - - err = OS::get_singleton()->execute(adb,args,true,NULL,NULL,&rv); - print_line("Reverse result2: "+itos(rv)); + args.push_back("tcp:" + itos(fs_port)); + args.push_back("tcp:" + itos(fs_port)); + err = OS::get_singleton()->execute(adb, args, true, NULL, NULL, &rv); + print_line("Reverse result2: " + itos(rv)); } - - ep.step("Running on Device..",3); + ep.step("Running on Device..", 3); args.clear(); args.push_back("-s"); args.push_back(devices[p_device].id); @@ -1752,10 +1681,10 @@ Error EditorExportPlatformAndroid::run(int p_device, int p_flags) { args.push_back("-a"); args.push_back("android.intent.action.MAIN"); args.push_back("-n"); - args.push_back(get_package_name()+"/org.godotengine.godot.Godot"); + args.push_back(get_package_name() + "/org.godotengine.godot.Godot"); - err = OS::get_singleton()->execute(adb,args,true,NULL,NULL,&rv); - if (err || rv!=0) { + err = OS::get_singleton()->execute(adb, args, true, NULL, NULL, &rv); + if (err || rv != 0) { EditorNode::add_io_error("Could not execute ondevice."); device_lock->unlock(); return ERR_CANT_CREATE; @@ -1768,99 +1697,97 @@ String EditorExportPlatformAndroid::get_package_name() { String pname = package; String basename = Globals::get_singleton()->get("application/name"); - basename=basename.to_lower(); + basename = basename.to_lower(); String name; - bool first=true; - for(int i=0;i<basename.length();i++) { + bool first = true; + for (int i = 0; i < basename.length(); i++) { CharType c = basename[i]; - if (c>='0' && c<='9' && first) { + if (c >= '0' && c <= '9' && first) { continue; } - if ((c>='a' && c<='z') || (c>='A' && c<='Z') || (c>='0' && c<='9')) { - name+=String::chr(c); - first=false; + if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9')) { + name += String::chr(c); + first = false; } } - if (name=="") - name="noname"; + if (name == "") + name = "noname"; - pname=pname.replace("$genname",name); + pname = pname.replace("$genname", name); return pname; - } EditorExportPlatformAndroid::EditorExportPlatformAndroid() { - version_code=1; - version_name="1.0"; - package="org.godotengine.$genname"; - name=""; - _signed=true; - apk_expansion=false; + version_code = 1; + version_name = "1.0"; + package = "org.godotengine.$genname"; + name = ""; + _signed = true; + apk_expansion = false; device_lock = Mutex::create(); - quit_request=false; - orientation=0; - remove_prev=true; - use_32_fb=true; - immersive=true; + quit_request = false; + orientation = 0; + remove_prev = true; + use_32_fb = true; + immersive = true; - export_arm=true; - export_x86=false; + export_arm = true; + export_x86 = false; + device_thread = Thread::create(_device_poll_thread, this); + devices_changed = true; - device_thread=Thread::create(_device_poll_thread,this); - devices_changed=true; - - Image img( _android_logo ); - logo = Ref<ImageTexture>( memnew( ImageTexture )); + Image img(_android_logo); + logo = Ref<ImageTexture>(memnew(ImageTexture)); logo->create_from_image(img); - for(int i=0;i<4;i++) - screen_support[i]=true; + for (int i = 0; i < 4; i++) + screen_support[i] = true; } bool EditorExportPlatformAndroid::can_export(String *r_error) const { - bool valid=true; - String adb=EditorSettings::get_singleton()->get("android/adb"); + bool valid = true; + String adb = EditorSettings::get_singleton()->get("android/adb"); String err; if (!FileAccess::exists(adb)) { - valid=false; - err+="ADB executable not configured in editor settings.\n"; + valid = false; + err += "ADB executable not configured in editor settings.\n"; } String js = EditorSettings::get_singleton()->get("android/jarsigner"); if (!FileAccess::exists(js)) { - valid=false; - err+="OpenJDK 6 jarsigner not configured in editor settings.\n"; + valid = false; + err += "OpenJDK 6 jarsigner not configured in editor settings.\n"; } String dk = EditorSettings::get_singleton()->get("android/debug_keystore"); if (!FileAccess::exists(dk)) { - valid=false; - err+="Debug Keystore not configured in editor settings.\n"; + valid = false; + err += "Debug Keystore not configured in editor settings.\n"; } if (!exists_export_template("android_debug.apk") || !exists_export_template("android_release.apk")) { - valid=false; - err+="No export templates found.\nDownload and install export templates.\n"; + valid = false; + err += "No export templates found.\nDownload and install export templates.\n"; } - if (custom_debug_package!="" && !FileAccess::exists(custom_debug_package)) { - valid=false; - err+="Custom debug package not found.\n"; + if (custom_debug_package != "" && !FileAccess::exists(custom_debug_package)) { + valid = false; + err += "Custom debug package not found.\n"; } - if (custom_release_package!="" && !FileAccess::exists(custom_release_package)) { - valid=false; - err+="Custom release package not found.\n"; + if (custom_release_package != "" && !FileAccess::exists(custom_release_package)) { + valid = false; + err += "Custom release package not found.\n"; } if (apk_expansion) { @@ -1869,47 +1796,44 @@ bool EditorExportPlatformAndroid::can_export(String *r_error) const { // valid=false; // err+="Invalid SALT for apk expansion.\n"; //} - if (apk_expansion_pkey=="") { - valid=false; - err+="Invalid public key for apk expansion.\n"; + if (apk_expansion_pkey == "") { + valid = false; + err += "Invalid public key for apk expansion.\n"; } } if (r_error) - *r_error=err; + *r_error = err; return valid; } - EditorExportPlatformAndroid::~EditorExportPlatformAndroid() { - quit_request=true; + quit_request = true; Thread::wait_to_finish(device_thread); memdelete(device_lock); memdelete(device_thread); } - void register_android_exporter() { - String exe_ext=OS::get_singleton()->get_name()=="Windows"?"exe":""; - EDITOR_DEF("android/adb",""); - EditorSettings::get_singleton()->add_property_hint(PropertyInfo(Variant::STRING,"android/adb",PROPERTY_HINT_GLOBAL_FILE,exe_ext)); - EDITOR_DEF("android/jarsigner",""); - EditorSettings::get_singleton()->add_property_hint(PropertyInfo(Variant::STRING,"android/jarsigner",PROPERTY_HINT_GLOBAL_FILE,exe_ext)); - EDITOR_DEF("android/debug_keystore",""); - EditorSettings::get_singleton()->add_property_hint(PropertyInfo(Variant::STRING,"android/debug_keystore",PROPERTY_HINT_GLOBAL_FILE,"keystore")); - EDITOR_DEF("android/debug_keystore_user","androiddebugkey"); - EDITOR_DEF("android/debug_keystore_pass","android"); + String exe_ext = OS::get_singleton()->get_name() == "Windows" ? "exe" : ""; + EDITOR_DEF("android/adb", ""); + EditorSettings::get_singleton()->add_property_hint(PropertyInfo(Variant::STRING, "android/adb", PROPERTY_HINT_GLOBAL_FILE, exe_ext)); + EDITOR_DEF("android/jarsigner", ""); + EditorSettings::get_singleton()->add_property_hint(PropertyInfo(Variant::STRING, "android/jarsigner", PROPERTY_HINT_GLOBAL_FILE, exe_ext)); + EDITOR_DEF("android/debug_keystore", ""); + EditorSettings::get_singleton()->add_property_hint(PropertyInfo(Variant::STRING, "android/debug_keystore", PROPERTY_HINT_GLOBAL_FILE, "keystore")); + EDITOR_DEF("android/debug_keystore_user", "androiddebugkey"); + EDITOR_DEF("android/debug_keystore_pass", "android"); //EDITOR_DEF("android/release_keystore",""); //EDITOR_DEF("android/release_username",""); //EditorSettings::get_singleton()->add_property_hint(PropertyInfo(Variant::STRING,"android/release_keystore",PROPERTY_HINT_GLOBAL_FILE,"*.keystore")); - EDITOR_DEF("android/timestamping_authority_url",""); - EDITOR_DEF("android/use_remote_debug_over_adb",false); - EDITOR_DEF("android/shutdown_adb_on_exit",true); + EDITOR_DEF("android/timestamping_authority_url", ""); + EDITOR_DEF("android/use_remote_debug_over_adb", false); + EDITOR_DEF("android/shutdown_adb_on_exit", true); - Ref<EditorExportPlatformAndroid> exporter = Ref<EditorExportPlatformAndroid>( memnew(EditorExportPlatformAndroid) ); + Ref<EditorExportPlatformAndroid> exporter = Ref<EditorExportPlatformAndroid>(memnew(EditorExportPlatformAndroid)); EditorImportExport::get_singleton()->add_export_platform(exporter); - } diff --git a/platform/android/file_access_android.cpp b/platform/android/file_access_android.cpp index 2828d3c07..4426af4da 100644 --- a/platform/android/file_access_android.cpp +++ b/platform/android/file_access_android.cpp @@ -29,40 +29,34 @@ #include "file_access_android.h" #include "print_string.h" - - - -AAssetManager *FileAccessAndroid::asset_manager=NULL; - +AAssetManager *FileAccessAndroid::asset_manager = NULL; /*void FileAccessAndroid::make_default() { create_func=create_android; }*/ -FileAccess* FileAccessAndroid::create_android() { +FileAccess *FileAccessAndroid::create_android() { return memnew(FileAccessAndroid); } +Error FileAccessAndroid::_open(const String &p_path, int p_mode_flags) { -Error FileAccessAndroid::_open(const String& p_path, int p_mode_flags) { - - String path=fix_path(p_path).simplify_path(); + String path = fix_path(p_path).simplify_path(); if (path.begins_with("/")) - path=path.substr(1,path.length()); + path = path.substr(1, path.length()); else if (path.begins_with("res://")) - path=path.substr(6,path.length()); + path = path.substr(6, path.length()); - - ERR_FAIL_COND_V(p_mode_flags&FileAccess::WRITE,ERR_UNAVAILABLE); //can't write on android.. - a=AAssetManager_open(asset_manager,path.utf8().get_data(),AASSET_MODE_STREAMING); + ERR_FAIL_COND_V(p_mode_flags & FileAccess::WRITE, ERR_UNAVAILABLE); //can't write on android.. + a = AAssetManager_open(asset_manager, path.utf8().get_data(), AASSET_MODE_STREAMING); if (!a) return ERR_CANT_OPEN; //ERR_FAIL_COND_V(!a,ERR_FILE_NOT_FOUND); - len=AAsset_getLength(a); - pos=0; - eof=false; + len = AAsset_getLength(a); + pos = 0; + eof = false; return OK; } @@ -72,34 +66,32 @@ void FileAccessAndroid::close() { if (!a) return; AAsset_close(a); - a=NULL; + a = NULL; } bool FileAccessAndroid::is_open() const { - return a!=NULL; + return a != NULL; } void FileAccessAndroid::seek(size_t p_position) { ERR_FAIL_COND(!a); - AAsset_seek(a,p_position,SEEK_SET); - pos=p_position; - if (pos>len) { - pos=len; - eof=true; + AAsset_seek(a, p_position, SEEK_SET); + pos = p_position; + if (pos > len) { + pos = len; + eof = true; } else { - eof=false; + eof = false; } - } void FileAccessAndroid::seek_end(int64_t p_position) { ERR_FAIL_COND(!a); - AAsset_seek(a,p_position,SEEK_END); - pos=len+p_position; - + AAsset_seek(a, p_position, SEEK_END); + pos = len + p_position; } size_t FileAccessAndroid::get_pos() const { @@ -119,79 +111,67 @@ bool FileAccessAndroid::eof_reached() const { uint8_t FileAccessAndroid::get_8() const { - - if (pos>=len) { - eof=true; + if (pos >= len) { + eof = true; return 0; } - uint8_t byte; - AAsset_read(a,&byte,1); + AAsset_read(a, &byte, 1); pos++; return byte; - } int FileAccessAndroid::get_buffer(uint8_t *p_dst, int p_length) const { + off_t r = AAsset_read(a, p_dst, p_length); - off_t r = AAsset_read(a,p_dst,p_length); - - if (pos+p_length >len ) { - eof=true; + if (pos + p_length > len) { + eof = true; } - if (r>=0) { + if (r >= 0) { - pos+=r; - if (pos>len) { - pos=len; + pos += r; + if (pos > len) { + pos = len; } - } return r; - } Error FileAccessAndroid::get_error() const { - return eof?ERR_FILE_EOF:OK; //not sure what else it may happen + return eof ? ERR_FILE_EOF : OK; //not sure what else it may happen } void FileAccessAndroid::store_8(uint8_t p_dest) { ERR_FAIL(); - } -bool FileAccessAndroid::file_exists(const String& p_path) { +bool FileAccessAndroid::file_exists(const String &p_path) { - String path=fix_path(p_path).simplify_path(); + String path = fix_path(p_path).simplify_path(); if (path.begins_with("/")) - path=path.substr(1,path.length()); + path = path.substr(1, path.length()); else if (path.begins_with("res://")) - path=path.substr(6,path.length()); + path = path.substr(6, path.length()); - AAsset *at=AAssetManager_open(asset_manager,path.utf8().get_data(),AASSET_MODE_STREAMING); + AAsset *at = AAssetManager_open(asset_manager, path.utf8().get_data(), AASSET_MODE_STREAMING); if (!at) return false; AAsset_close(at); return true; - } - FileAccessAndroid::FileAccessAndroid() { - a=NULL; - eof=false; + a = NULL; + eof = false; } - -FileAccessAndroid::~FileAccessAndroid() -{ +FileAccessAndroid::~FileAccessAndroid() { close(); } - diff --git a/platform/android/file_access_android.h b/platform/android/file_access_android.h index 3d54eb202..de131f19b 100644 --- a/platform/android/file_access_android.h +++ b/platform/android/file_access_android.h @@ -29,33 +29,29 @@ #ifndef FILE_ACCESS_ANDROID_H #define FILE_ACCESS_ANDROID_H - - #include "os/file_access.h" -#include <stdio.h> #include <android/asset_manager.h> #include <android/log.h> +#include <stdio.h> //#include <android_native_app_glue.h> - class FileAccessAndroid : public FileAccess { - static FileAccess* create_android(); + static FileAccess *create_android(); mutable AAsset *a; mutable size_t len; mutable size_t pos; mutable bool eof; public: - static AAssetManager *asset_manager; - virtual Error _open(const String& p_path, int p_mode_flags); ///< open a file + virtual Error _open(const String &p_path, int p_mode_flags); ///< open a file virtual void close(); ///< close a file virtual bool is_open() const; ///< true when file is open virtual void seek(size_t p_position); ///< seek to a given position - virtual void seek_end(int64_t p_position=0); ///< seek from the end of file + virtual void seek_end(int64_t p_position = 0); ///< seek from the end of file virtual size_t get_pos() const; ///< get position in the file virtual size_t get_len() const; ///< get size of the file @@ -68,9 +64,9 @@ public: virtual void store_8(uint8_t p_dest); ///< store a byte - virtual bool file_exists(const String& p_path); ///< return true if a file exists + virtual bool file_exists(const String &p_path); ///< return true if a file exists - virtual uint64_t _get_modified_time(const String& p_file) { return 0; } + virtual uint64_t _get_modified_time(const String &p_file) { return 0; } //static void make_default(); @@ -79,4 +75,3 @@ public: }; #endif // FILE_ACCESS_ANDROID_H - diff --git a/platform/android/file_access_jandroid.cpp b/platform/android/file_access_jandroid.cpp index 4755f1d02..040a54deb 100644 --- a/platform/android/file_access_jandroid.cpp +++ b/platform/android/file_access_jandroid.cpp @@ -30,51 +30,46 @@ #include "file_access_jandroid.h" #include "os/os.h" -#include <unistd.h> #include "thread_jandroid.h" +#include <unistd.h> -jobject FileAccessJAndroid::io=NULL; +jobject FileAccessJAndroid::io = NULL; jclass FileAccessJAndroid::cls; -jmethodID FileAccessJAndroid::_file_open=0; -jmethodID FileAccessJAndroid::_file_get_size=0; -jmethodID FileAccessJAndroid::_file_seek=0; -jmethodID FileAccessJAndroid::_file_read=0; -jmethodID FileAccessJAndroid::_file_tell=0; -jmethodID FileAccessJAndroid::_file_eof=0; -jmethodID FileAccessJAndroid::_file_close=0; - +jmethodID FileAccessJAndroid::_file_open = 0; +jmethodID FileAccessJAndroid::_file_get_size = 0; +jmethodID FileAccessJAndroid::_file_seek = 0; +jmethodID FileAccessJAndroid::_file_read = 0; +jmethodID FileAccessJAndroid::_file_tell = 0; +jmethodID FileAccessJAndroid::_file_eof = 0; +jmethodID FileAccessJAndroid::_file_close = 0; -FileAccess* FileAccessJAndroid::create_jandroid() { +FileAccess *FileAccessJAndroid::create_jandroid() { return memnew(FileAccessJAndroid); } -Error FileAccessJAndroid::_open(const String& p_path, int p_mode_flags) { +Error FileAccessJAndroid::_open(const String &p_path, int p_mode_flags) { if (is_open()) close(); - String path=fix_path(p_path).simplify_path(); + String path = fix_path(p_path).simplify_path(); if (path.begins_with("/")) - path=path.substr(1,path.length()); + path = path.substr(1, path.length()); else if (path.begins_with("res://")) - path=path.substr(6,path.length()); + path = path.substr(6, path.length()); JNIEnv *env = ThreadAndroid::get_env(); - - jstring js = env->NewStringUTF(path.utf8().get_data()); - int res = env->CallIntMethod(io,_file_open,js,p_mode_flags&WRITE?true:false); + int res = env->CallIntMethod(io, _file_open, js, p_mode_flags & WRITE ? true : false); env->DeleteLocalRef(js); - OS::get_singleton()->print("fopen: '%s' ret %i\n",path.utf8().get_data(),res); + OS::get_singleton()->print("fopen: '%s' ret %i\n", path.utf8().get_data(), res); - - if (res<=0) + if (res <= 0) return ERR_FILE_CANT_OPEN; - id=res; - + id = res; return OK; } @@ -86,14 +81,13 @@ void FileAccessJAndroid::close() { JNIEnv *env = ThreadAndroid::get_env(); - env->CallVoidMethod(io,_file_close,id); - id=0; - + env->CallVoidMethod(io, _file_close, id); + id = 0; } bool FileAccessJAndroid::is_open() const { - return id!=0; + return id != 0; } void FileAccessJAndroid::seek(size_t p_position) { @@ -101,7 +95,7 @@ void FileAccessJAndroid::seek(size_t p_position) { JNIEnv *env = ThreadAndroid::get_env(); ERR_FAIL_COND(!is_open()); - env->CallVoidMethod(io,_file_seek,id,p_position); + env->CallVoidMethod(io, _file_seek, id, p_position); } void FileAccessJAndroid::seek_end(int64_t p_position) { @@ -109,56 +103,50 @@ void FileAccessJAndroid::seek_end(int64_t p_position) { ERR_FAIL_COND(!is_open()); seek(get_len()); - } size_t FileAccessJAndroid::get_pos() const { JNIEnv *env = ThreadAndroid::get_env(); - ERR_FAIL_COND_V(!is_open(),0); - return env->CallIntMethod(io,_file_tell,id); - + ERR_FAIL_COND_V(!is_open(), 0); + return env->CallIntMethod(io, _file_tell, id); } size_t FileAccessJAndroid::get_len() const { JNIEnv *env = ThreadAndroid::get_env(); - ERR_FAIL_COND_V(!is_open(),0); - return env->CallIntMethod(io,_file_get_size,id); - + ERR_FAIL_COND_V(!is_open(), 0); + return env->CallIntMethod(io, _file_get_size, id); } bool FileAccessJAndroid::eof_reached() const { JNIEnv *env = ThreadAndroid::get_env(); - ERR_FAIL_COND_V(!is_open(),0); - return env->CallIntMethod(io,_file_eof,id); - + ERR_FAIL_COND_V(!is_open(), 0); + return env->CallIntMethod(io, _file_eof, id); } uint8_t FileAccessJAndroid::get_8() const { - ERR_FAIL_COND_V(!is_open(),0); + ERR_FAIL_COND_V(!is_open(), 0); uint8_t byte; - get_buffer(&byte,1); + get_buffer(&byte, 1); return byte; } int FileAccessJAndroid::get_buffer(uint8_t *p_dst, int p_length) const { - ERR_FAIL_COND_V(!is_open(),0); - if (p_length==0) + ERR_FAIL_COND_V(!is_open(), 0); + if (p_length == 0) return 0; JNIEnv *env = ThreadAndroid::get_env(); - jbyteArray jca = (jbyteArray)env->CallObjectMethod(io,_file_read,id,p_length); - + jbyteArray jca = (jbyteArray)env->CallObjectMethod(io, _file_read, id, p_length); int len = env->GetArrayLength(jca); - env->GetByteArrayRegion(jca,0,len,(jbyte*)p_dst); + env->GetByteArrayRegion(jca, 0, len, (jbyte *)p_dst); env->DeleteLocalRef((jobject)jca); return len; - } Error FileAccessJAndroid::get_error() const { @@ -169,80 +157,76 @@ Error FileAccessJAndroid::get_error() const { } void FileAccessJAndroid::store_8(uint8_t p_dest) { - } -bool FileAccessJAndroid::file_exists(const String& p_path) { +bool FileAccessJAndroid::file_exists(const String &p_path) { JNIEnv *env = ThreadAndroid::get_env(); - String path=fix_path(p_path).simplify_path(); + String path = fix_path(p_path).simplify_path(); if (path.begins_with("/")) - path=path.substr(1,path.length()); + path = path.substr(1, path.length()); else if (path.begins_with("res://")) - path=path.substr(6,path.length()); + path = path.substr(6, path.length()); jstring js = env->NewStringUTF(path.utf8().get_data()); - int res = env->CallIntMethod(io,_file_open,js,false); - if (res<=0) { + int res = env->CallIntMethod(io, _file_open, js, false); + if (res <= 0) { env->DeleteLocalRef(js); return false; } - env->CallVoidMethod(io,_file_close,res); + env->CallVoidMethod(io, _file_close, res); env->DeleteLocalRef(js); return true; - } +void FileAccessJAndroid::setup(jobject p_io) { -void FileAccessJAndroid::setup( jobject p_io) { - - io=p_io; + io = p_io; JNIEnv *env = ThreadAndroid::get_env(); - __android_log_print(ANDROID_LOG_INFO,"godot","STEP5"); + __android_log_print(ANDROID_LOG_INFO, "godot", "STEP5"); jclass c = env->GetObjectClass(io); - __android_log_print(ANDROID_LOG_INFO,"godot","STEP6"); - cls=(jclass)env->NewGlobalRef(c); + __android_log_print(ANDROID_LOG_INFO, "godot", "STEP6"); + cls = (jclass)env->NewGlobalRef(c); _file_open = env->GetMethodID(cls, "file_open", "(Ljava/lang/String;Z)I"); - if(_file_open != 0) { - __android_log_print(ANDROID_LOG_INFO,"godot","*******GOT METHOD _file_open ok!!"); + if (_file_open != 0) { + __android_log_print(ANDROID_LOG_INFO, "godot", "*******GOT METHOD _file_open ok!!"); } _file_get_size = env->GetMethodID(cls, "file_get_size", "(I)I"); - if(_file_get_size != 0) { - __android_log_print(ANDROID_LOG_INFO,"godot","*******GOT METHOD _file_get_size ok!!"); + if (_file_get_size != 0) { + __android_log_print(ANDROID_LOG_INFO, "godot", "*******GOT METHOD _file_get_size ok!!"); } _file_tell = env->GetMethodID(cls, "file_tell", "(I)I"); - if(_file_tell != 0) { - __android_log_print(ANDROID_LOG_INFO,"godot","*******GOT METHOD _file_tell ok!!"); + if (_file_tell != 0) { + __android_log_print(ANDROID_LOG_INFO, "godot", "*******GOT METHOD _file_tell ok!!"); } _file_eof = env->GetMethodID(cls, "file_eof", "(I)Z"); - if(_file_eof != 0) { - __android_log_print(ANDROID_LOG_INFO,"godot","*******GOT METHOD _file_eof ok!!"); + if (_file_eof != 0) { + __android_log_print(ANDROID_LOG_INFO, "godot", "*******GOT METHOD _file_eof ok!!"); } _file_seek = env->GetMethodID(cls, "file_seek", "(II)V"); - if(_file_seek != 0) { - __android_log_print(ANDROID_LOG_INFO,"godot","*******GOT METHOD _file_seek ok!!"); + if (_file_seek != 0) { + __android_log_print(ANDROID_LOG_INFO, "godot", "*******GOT METHOD _file_seek ok!!"); } _file_read = env->GetMethodID(cls, "file_read", "(II)[B"); - if(_file_read != 0) { - __android_log_print(ANDROID_LOG_INFO,"godot","*******GOT METHOD _file_read ok!!"); + if (_file_read != 0) { + __android_log_print(ANDROID_LOG_INFO, "godot", "*******GOT METHOD _file_read ok!!"); } _file_close = env->GetMethodID(cls, "file_close", "(I)V"); - if(_file_close != 0) { - __android_log_print(ANDROID_LOG_INFO,"godot","*******GOT METHOD _file_close ok!!"); + if (_file_close != 0) { + __android_log_print(ANDROID_LOG_INFO, "godot", "*******GOT METHOD _file_close ok!!"); } -// (*env)->CallVoidMethod(env,obj,aMethodID, myvar); + // (*env)->CallVoidMethod(env,obj,aMethodID, myvar); } - FileAccessJAndroid::FileAccessJAndroid() { - id=0; + id = 0; } FileAccessJAndroid::~FileAccessJAndroid() { @@ -251,5 +235,4 @@ FileAccessJAndroid::~FileAccessJAndroid() { close(); } - #endif diff --git a/platform/android/file_access_jandroid.h b/platform/android/file_access_jandroid.h index 38f441ea7..b78d5e603 100644 --- a/platform/android/file_access_jandroid.h +++ b/platform/android/file_access_jandroid.h @@ -47,17 +47,15 @@ class FileAccessJAndroid : public FileAccess { static jmethodID _file_close; int id; - static FileAccess* create_jandroid(); - + static FileAccess *create_jandroid(); public: - - virtual Error _open(const String& p_path, int p_mode_flags); ///< open a file + virtual Error _open(const String &p_path, int p_mode_flags); ///< open a file virtual void close(); ///< close a file virtual bool is_open() const; ///< true when file is open virtual void seek(size_t p_position); ///< seek to a given position - virtual void seek_end(int64_t p_position=0); ///< seek from the end of file + virtual void seek_end(int64_t p_position = 0); ///< seek from the end of file virtual size_t get_pos() const; ///< get position in the file virtual size_t get_len() const; ///< get size of the file @@ -70,13 +68,11 @@ public: virtual void store_8(uint8_t p_dest); ///< store a byte - virtual bool file_exists(const String& p_path); ///< return true if a file exists - - + virtual bool file_exists(const String &p_path); ///< return true if a file exists - static void setup( jobject io); + static void setup(jobject io); - virtual uint64_t _get_modified_time(const String& p_file) { return 0; } + virtual uint64_t _get_modified_time(const String &p_file) { return 0; } FileAccessJAndroid(); ~FileAccessJAndroid(); diff --git a/platform/android/globals/global_defaults.cpp b/platform/android/globals/global_defaults.cpp index 3ec1094ee..1cb317a03 100644 --- a/platform/android/globals/global_defaults.cpp +++ b/platform/android/globals/global_defaults.cpp @@ -29,13 +29,12 @@ #include "global_defaults.h" #include "globals.h" - void register_android_global_defaults() { - GLOBAL_DEF("rasterizer.Android/use_fragment_lighting",false); - GLOBAL_DEF("rasterizer.Android/fp16_framebuffer",false); - GLOBAL_DEF("display.Android/driver","GLES2"); -// GLOBAL_DEF("rasterizer.Android/trilinear_mipmap_filter",false); + GLOBAL_DEF("rasterizer.Android/use_fragment_lighting", false); + GLOBAL_DEF("rasterizer.Android/fp16_framebuffer", false); + GLOBAL_DEF("display.Android/driver", "GLES2"); + // GLOBAL_DEF("rasterizer.Android/trilinear_mipmap_filter",false); - Globals::get_singleton()->set_custom_property_info("display.Android/driver",PropertyInfo(Variant::STRING,"display.Android/driver",PROPERTY_HINT_ENUM,"GLES2")); + Globals::get_singleton()->set_custom_property_info("display.Android/driver", PropertyInfo(Variant::STRING, "display.Android/driver", PROPERTY_HINT_ENUM, "GLES2")); } diff --git a/platform/android/godot_android.cpp b/platform/android/godot_android.cpp index d3683d842..b9c96d233 100644 --- a/platform/android/godot_android.cpp +++ b/platform/android/godot_android.cpp @@ -28,139 +28,130 @@ /*************************************************************************/ #ifdef ANDROID_NATIVE_ACTIVITY -#include <jni.h> #include <errno.h> +#include <jni.h> #include <EGL/egl.h> #include <GLES2/gl2.h> +#include "file_access_android.h" +#include "globals.h" +#include "main/main.h" +#include "os_android.h" +#include <android/log.h> #include <android/sensor.h> #include <android/window.h> -#include <android/log.h> #include <android_native_app_glue.h> -#include "file_access_android.h" +#include <stdlib.h> #include <string.h> #include <unistd.h> -#include <stdlib.h> -#include "os_android.h" -#include "globals.h" -#include "main/main.h" #define LOGI(...) ((void)__android_log_print(ANDROID_LOG_INFO, "godot", __VA_ARGS__)) #define LOGW(...) ((void)__android_log_print(ANDROID_LOG_WARN, "godot", __VA_ARGS__)) - extern "C" { - JNIEXPORT void JNICALL Java_org_godotengine_godot_Godot_registerSingleton(JNIEnv * env, jobject obj, jstring name,jobject p_object); - JNIEXPORT void JNICALL Java_org_godotengine_godot_Godot_registerMethod(JNIEnv * env, jobject obj, jstring sname, jstring name, jstring ret, jobjectArray args); - JNIEXPORT jstring JNICALL Java_org_godotengine_godot_Godot_getGlobal(JNIEnv * env, jobject obj, jstring path); +JNIEXPORT void JNICALL Java_org_godotengine_godot_Godot_registerSingleton(JNIEnv *env, jobject obj, jstring name, jobject p_object); +JNIEXPORT void JNICALL Java_org_godotengine_godot_Godot_registerMethod(JNIEnv *env, jobject obj, jstring sname, jstring name, jstring ret, jobjectArray args); +JNIEXPORT jstring JNICALL Java_org_godotengine_godot_Godot_getGlobal(JNIEnv *env, jobject obj, jstring path); }; class JNISingleton : public Object { - OBJ_TYPE( JNISingleton, Object ); - + OBJ_TYPE(JNISingleton, Object); struct MethodData { - jmethodID method; Variant::Type ret_type; Vector<Variant::Type> argtypes; }; jobject instance; - Map<StringName,MethodData> method_map; + Map<StringName, MethodData> method_map; JNIEnv *env; public: + void update_env(JNIEnv *p_env) { env = p_env; } - void update_env(JNIEnv *p_env) { env=p_env; } + virtual Variant call(const StringName &p_method, const Variant **p_args, int p_argcount, Variant::CallError &r_error) { - 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)); - print_line("attempt to call "+String(p_method)); + r_error.error = Variant::CallError::CALL_OK; - r_error.error=Variant::CallError::CALL_OK; - - Map<StringName,MethodData >::Element *E=method_map.find(p_method); + Map<StringName, MethodData>::Element *E = method_map.find(p_method); if (!E) { print_line("no exists"); - r_error.error=Variant::CallError::CALL_ERROR_INVALID_METHOD; + r_error.error = Variant::CallError::CALL_ERROR_INVALID_METHOD; return Variant(); } - int ac = E->get().argtypes.size(); - if (ac<p_argcount) { + if (ac < p_argcount) { print_line("fewargs"); - r_error.error=Variant::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS; - r_error.argument=ac; + r_error.error = Variant::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS; + r_error.argument = ac; return Variant(); } - if (ac>p_argcount) { + if (ac > p_argcount) { print_line("manyargs"); - r_error.error=Variant::CallError::CALL_ERROR_TOO_MANY_ARGUMENTS; - r_error.argument=ac; + r_error.error = Variant::CallError::CALL_ERROR_TOO_MANY_ARGUMENTS; + r_error.argument = ac; return Variant(); } + for (int i = 0; i < p_argcount; i++) { + if (!Variant::can_convert(p_args[i]->get_type(), E->get().argtypes[i])) { - for(int i=0;i<p_argcount;i++) { - - if (!Variant::can_convert(p_args[i]->get_type(),E->get().argtypes[i])) { - - r_error.error=Variant::CallError::CALL_ERROR_INVALID_ARGUMENT; - r_error.argument=i; - r_error.expected=E->get().argtypes[i]; + r_error.error = Variant::CallError::CALL_ERROR_INVALID_ARGUMENT; + r_error.argument = i; + r_error.expected = E->get().argtypes[i]; } } - - jvalue *v=NULL; + jvalue *v = NULL; if (p_argcount) { - v=(jvalue*)alloca( sizeof(jvalue)*p_argcount ); + v = (jvalue *)alloca(sizeof(jvalue) * p_argcount); } - for(int i=0;i<p_argcount;i++) { - + for (int i = 0; i < p_argcount; i++) { - switch(E->get().argtypes[i]) { + switch (E->get().argtypes[i]) { case Variant::BOOL: { - v[i].z=*p_args[i]; + v[i].z = *p_args[i]; } break; case Variant::INT: { - v[i].i=*p_args[i]; + v[i].i = *p_args[i]; } break; case Variant::REAL: { - v[i].f=*p_args[i]; + v[i].f = *p_args[i]; } break; case Variant::STRING: { String s = *p_args[i]; jstring jStr = env->NewStringUTF(s.utf8().get_data()); - v[i].l=jStr; + v[i].l = jStr; } break; case Variant::STRING_ARRAY: { DVector<String> sarray = *p_args[i]; - jobjectArray arr = env->NewObjectArray(sarray.size(),env->FindClass("java/lang/String"),env->NewStringUTF("")); + jobjectArray arr = env->NewObjectArray(sarray.size(), env->FindClass("java/lang/String"), env->NewStringUTF("")); - for(int j=0;j<sarray.size();j++) { + for (int j = 0; j < sarray.size(); j++) { - env->SetObjectArrayElement(arr,j,env->NewStringUTF( sarray[i].utf8().get_data() )); + env->SetObjectArrayElement(arr, j, env->NewStringUTF(sarray[i].utf8().get_data())); } - v[i].l=arr; + v[i].l = arr; } break; case Variant::INT_ARRAY: { @@ -168,8 +159,8 @@ public: DVector<int> array = *p_args[i]; jintArray arr = env->NewIntArray(array.size()); DVector<int>::Read r = array.read(); - env->SetIntArrayRegion(arr,0,array.size(),r.ptr()); - v[i].l=arr; + env->SetIntArrayRegion(arr, 0, array.size(), r.ptr()); + v[i].l = arr; } break; case Variant::REAL_ARRAY: { @@ -177,15 +168,14 @@ public: DVector<float> array = *p_args[i]; jfloatArray arr = env->NewFloatArray(array.size()); DVector<float>::Read r = array.read(); - env->SetFloatArrayRegion(arr,0,array.size(),r.ptr()); - v[i].l=arr; + env->SetFloatArrayRegion(arr, 0, array.size(), r.ptr()); + v[i].l = arr; } break; default: { ERR_FAIL_V(Variant()); } break; - } } @@ -193,78 +183,76 @@ public: Variant ret; - switch(E->get().ret_type) { + switch (E->get().ret_type) { case Variant::NIL: { - print_line("call void"); - env->CallVoidMethodA(instance,E->get().method,v); + env->CallVoidMethodA(instance, E->get().method, v); } break; case Variant::BOOL: { - ret = env->CallBooleanMethodA(instance,E->get().method,v); + ret = env->CallBooleanMethodA(instance, E->get().method, v); print_line("call bool"); } break; case Variant::INT: { - ret = env->CallIntMethodA(instance,E->get().method,v); + ret = env->CallIntMethodA(instance, E->get().method, v); print_line("call int"); } break; case Variant::REAL: { - ret = env->CallFloatMethodA(instance,E->get().method,v); + ret = env->CallFloatMethodA(instance, E->get().method, v); } break; case Variant::STRING: { - jobject o = env->CallObjectMethodA(instance,E->get().method,v); - String singname = env->GetStringUTFChars((jstring)o, NULL ); + jobject o = env->CallObjectMethodA(instance, E->get().method, v); + String singname = env->GetStringUTFChars((jstring)o, NULL); } break; case Variant::STRING_ARRAY: { - jobjectArray arr = (jobjectArray)env->CallObjectMethodA(instance,E->get().method,v); + jobjectArray arr = (jobjectArray)env->CallObjectMethodA(instance, E->get().method, v); int stringCount = env->GetArrayLength(arr); DVector<String> sarr; - for (int i=0; i<stringCount; i++) { - jstring string = (jstring) env->GetObjectArrayElement(arr, i); + for (int i = 0; i < stringCount; i++) { + jstring string = (jstring)env->GetObjectArrayElement(arr, i); const char *rawString = env->GetStringUTFChars(string, 0); sarr.push_back(String(rawString)); } - ret=sarr; + ret = sarr; } break; case Variant::INT_ARRAY: { - jintArray arr = (jintArray)env->CallObjectMethodA(instance,E->get().method,v); + jintArray arr = (jintArray)env->CallObjectMethodA(instance, E->get().method, v); int fCount = env->GetArrayLength(arr); DVector<int> sarr; sarr.resize(fCount); DVector<int>::Write w = sarr.write(); - env->GetIntArrayRegion(arr,0,fCount,w.ptr()); + env->GetIntArrayRegion(arr, 0, fCount, w.ptr()); w = DVector<int>::Write(); - ret=sarr; + ret = sarr; } break; case Variant::REAL_ARRAY: { - jfloatArray arr = (jfloatArray)env->CallObjectMethodA(instance,E->get().method,v); + jfloatArray arr = (jfloatArray)env->CallObjectMethodA(instance, E->get().method, v); int fCount = env->GetArrayLength(arr); DVector<float> sarr; sarr.resize(fCount); DVector<float>::Write w = sarr.write(); - env->GetFloatArrayRegion(arr,0,fCount,w.ptr()); + env->GetFloatArrayRegion(arr, 0, fCount, w.ptr()); w = DVector<float>::Write(); - ret=sarr; + ret = sarr; } break; default: { - print_line("failure.."); ERR_FAIL_V(Variant()); } break; @@ -275,322 +263,302 @@ public: return ret; } - jobject get_instance() const { return instance; } void set_instance(jobject p_instance) { - instance=p_instance; + instance = p_instance; } - - void add_method(const StringName& p_name, jmethodID p_method,const Vector<Variant::Type>& p_args, Variant::Type p_ret_type) { + void add_method(const StringName &p_name, jmethodID p_method, const Vector<Variant::Type> &p_args, Variant::Type p_ret_type) { MethodData md; - md.method=p_method; - md.argtypes=p_args; - md.ret_type=p_ret_type; - method_map[p_name]=md; - + md.method = p_method; + md.argtypes = p_args; + md.ret_type = p_ret_type; + method_map[p_name] = md; } - JNISingleton() {} - }; //JNIEnv *JNISingleton::env=NULL; -static HashMap<String,JNISingleton*> jni_singletons; - +static HashMap<String, JNISingleton *> jni_singletons; struct engine { - struct android_app* app; - OS_Android *os; - JNIEnv *jni; - - ASensorManager* sensorManager; - const ASensor* accelerometerSensor; - const ASensor* magnetometerSensor; - const ASensor* gyroscopeSensor; - ASensorEventQueue* sensorEventQueue; + struct android_app *app; + OS_Android *os; + JNIEnv *jni; - bool display_active; - bool requested_quit; - int animating; - EGLDisplay display; - EGLSurface surface; - EGLContext context; - int32_t width; - int32_t height; + ASensorManager *sensorManager; + const ASensor *accelerometerSensor; + const ASensor *magnetometerSensor; + const ASensor *gyroscopeSensor; + ASensorEventQueue *sensorEventQueue; + bool display_active; + bool requested_quit; + int animating; + EGLDisplay display; + EGLSurface surface; + EGLContext context; + int32_t width; + int32_t height; }; /** * Initialize an EGL context for the current display. */ -static int engine_init_display(struct engine* engine,bool p_gl2) { - // initialize OpenGL ES and EGL +static int engine_init_display(struct engine *engine, bool p_gl2) { + // initialize OpenGL ES and EGL - /* + /* * Here specify the attributes of the desired configuration. * Below, we select an EGLConfig with at least 8 bits per color * component compatible with on-screen windows */ - const EGLint gl2_attribs[] = { - // EGL_SURFACE_TYPE, EGL_WINDOW_BIT, - EGL_BLUE_SIZE, 4, - EGL_GREEN_SIZE, 4, - EGL_RED_SIZE, 4, - EGL_ALPHA_SIZE, 0, - EGL_DEPTH_SIZE, 16, - EGL_STENCIL_SIZE, EGL_DONT_CARE, - EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, - EGL_NONE - }; - - const EGLint gl1_attribs[] = { - // EGL_SURFACE_TYPE, EGL_WINDOW_BIT, - EGL_BLUE_SIZE, 4, - EGL_GREEN_SIZE, 4, - EGL_RED_SIZE, 4, - EGL_ALPHA_SIZE, 0, - EGL_DEPTH_SIZE, 16, - EGL_STENCIL_SIZE, EGL_DONT_CARE, - EGL_NONE - }; - - const EGLint *attribs=p_gl2?gl2_attribs:gl1_attribs; + const EGLint gl2_attribs[] = { + // EGL_SURFACE_TYPE, EGL_WINDOW_BIT, + EGL_BLUE_SIZE, 4, + EGL_GREEN_SIZE, 4, + EGL_RED_SIZE, 4, + EGL_ALPHA_SIZE, 0, + EGL_DEPTH_SIZE, 16, + EGL_STENCIL_SIZE, EGL_DONT_CARE, + EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, + EGL_NONE + }; + const EGLint gl1_attribs[] = { + // EGL_SURFACE_TYPE, EGL_WINDOW_BIT, + EGL_BLUE_SIZE, 4, + EGL_GREEN_SIZE, 4, + EGL_RED_SIZE, 4, + EGL_ALPHA_SIZE, 0, + EGL_DEPTH_SIZE, 16, + EGL_STENCIL_SIZE, EGL_DONT_CARE, + EGL_NONE + }; - EGLint w, h, dummy, format; - EGLint numConfigs; - EGLConfig config; - EGLSurface surface; - EGLContext context; + const EGLint *attribs = p_gl2 ? gl2_attribs : gl1_attribs; - EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY); + EGLint w, h, dummy, format; + EGLint numConfigs; + EGLConfig config; + EGLSurface surface; + EGLContext context; - eglInitialize(display, 0, 0); + EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY); + eglInitialize(display, 0, 0); - /* Here, the application chooses the configuration it desires. In this + /* Here, the application chooses the configuration it desires. In this * sample, we have a very simplified selection process, where we pick * the first EGLConfig that matches our criteria */ - eglChooseConfig(display, attribs, &config, 1, &numConfigs); + eglChooseConfig(display, attribs, &config, 1, &numConfigs); - LOGI("Num configs: %i\n",numConfigs); + LOGI("Num configs: %i\n", numConfigs); - /* EGL_NATIVE_VISUAL_ID is an attribute of the EGLConfig that is + /* EGL_NATIVE_VISUAL_ID is an attribute of the EGLConfig that is * guaranteed to be accepted by ANativeWindow_setBuffersGeometry(). * As soon as we picked a EGLConfig, we can safely reconfigure the * ANativeWindow buffers to match, using EGL_NATIVE_VISUAL_ID. */ - eglGetConfigAttrib(display, config, EGL_NATIVE_VISUAL_ID, &format); + eglGetConfigAttrib(display, config, EGL_NATIVE_VISUAL_ID, &format); - ANativeWindow_setBuffersGeometry(engine->app->window, 0, 0, format); - //ANativeWindow_setFlags(engine->app->window, 0, 0, format|); + ANativeWindow_setBuffersGeometry(engine->app->window, 0, 0, format); + //ANativeWindow_setFlags(engine->app->window, 0, 0, format|); - surface = eglCreateWindowSurface(display, config, engine->app->window, NULL); + surface = eglCreateWindowSurface(display, config, engine->app->window, NULL); - const EGLint context_attribs[] = { - EGL_CONTEXT_CLIENT_VERSION,2, - EGL_NONE - }; - context = eglCreateContext(display, config, EGL_NO_CONTEXT, p_gl2?context_attribs:NULL); - - if (eglMakeCurrent(display, surface, surface, context) == EGL_FALSE) { - LOGW("Unable to eglMakeCurrent"); - return -1; - } + const EGLint context_attribs[] = { + EGL_CONTEXT_CLIENT_VERSION, 2, + EGL_NONE + }; + context = eglCreateContext(display, config, EGL_NO_CONTEXT, p_gl2 ? context_attribs : NULL); - eglQuerySurface(display, surface, EGL_WIDTH, &w); - eglQuerySurface(display, surface, EGL_HEIGHT, &h); - print_line("INIT VIDEO MODE: "+itos(w)+","+itos(h)); + if (eglMakeCurrent(display, surface, surface, context) == EGL_FALSE) { + LOGW("Unable to eglMakeCurrent"); + return -1; + } - //engine->os->set_egl_extensions(eglQueryString(display,EGL_EXTENSIONS)); - engine->os->init_video_mode(w,h); + eglQuerySurface(display, surface, EGL_WIDTH, &w); + eglQuerySurface(display, surface, EGL_HEIGHT, &h); + print_line("INIT VIDEO MODE: " + itos(w) + "," + itos(h)); + //engine->os->set_egl_extensions(eglQueryString(display,EGL_EXTENSIONS)); + engine->os->init_video_mode(w, h); - engine->display = display; - engine->context = context; - engine->surface = surface; - engine->width = w; - engine->height = h; - engine->display_active=true; + engine->display = display; + engine->context = context; + engine->surface = surface; + engine->width = w; + engine->height = h; + engine->display_active = true; - //engine->state.angle = 0; + //engine->state.angle = 0; - // Initialize GL state. - //glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST); - glEnable(GL_CULL_FACE); - // glShadeModel(GL_SMOOTH); - glDisable(GL_DEPTH_TEST); - LOGI("GL Version: %s - %s %s\n", glGetString(GL_VERSION),glGetString(GL_VENDOR), glGetString(GL_RENDERER)); + // Initialize GL state. + //glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST); + glEnable(GL_CULL_FACE); + // glShadeModel(GL_SMOOTH); + glDisable(GL_DEPTH_TEST); + LOGI("GL Version: %s - %s %s\n", glGetString(GL_VERSION), glGetString(GL_VENDOR), glGetString(GL_RENDERER)); - return 0; + return 0; } +static void engine_draw_frame(struct engine *engine) { + if (engine->display == NULL) { + // No display. + return; + } -static void engine_draw_frame(struct engine* engine) { - if (engine->display == NULL) { - // No display. - return; - } - - // Just fill the screen with a color. - //glClearColor(0,1,0,1); - //glClear(GL_COLOR_BUFFER_BIT); - if (engine->os && engine->os->main_loop_iterate()==true) { + // Just fill the screen with a color. + //glClearColor(0,1,0,1); + //glClear(GL_COLOR_BUFFER_BIT); + if (engine->os && engine->os->main_loop_iterate() == true) { - engine->requested_quit=true; - return; //should exit instead - } + engine->requested_quit = true; + return; //should exit instead + } - eglSwapBuffers(engine->display, engine->surface); + eglSwapBuffers(engine->display, engine->surface); } - -static void engine_term_display(struct engine* engine) { - if (engine->display != EGL_NO_DISPLAY) { - eglMakeCurrent(engine->display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); - if (engine->context != EGL_NO_CONTEXT) { - eglDestroyContext(engine->display, engine->context); - } - if (engine->surface != EGL_NO_SURFACE) { - eglDestroySurface(engine->display, engine->surface); +static void engine_term_display(struct engine *engine) { + if (engine->display != EGL_NO_DISPLAY) { + eglMakeCurrent(engine->display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); + if (engine->context != EGL_NO_CONTEXT) { + eglDestroyContext(engine->display, engine->context); + } + if (engine->surface != EGL_NO_SURFACE) { + eglDestroySurface(engine->display, engine->surface); + } + eglTerminate(engine->display); } - eglTerminate(engine->display); - } - - engine->animating = 0; - engine->display = EGL_NO_DISPLAY; - engine->context = EGL_NO_CONTEXT; - engine->surface = EGL_NO_SURFACE; - engine->display_active=false; + engine->animating = 0; + engine->display = EGL_NO_DISPLAY; + engine->context = EGL_NO_CONTEXT; + engine->surface = EGL_NO_SURFACE; + engine->display_active = false; } /** * Process the next input event. */ -static int32_t engine_handle_input(struct android_app* app, AInputEvent* event) { - struct engine* engine = (struct engine*)app->userData; +static int32_t engine_handle_input(struct android_app *app, AInputEvent *event) { + struct engine *engine = (struct engine *)app->userData; if (!engine->os) return 0; - switch(AInputEvent_getType(event)) { + switch (AInputEvent_getType(event)) { case AINPUT_EVENT_TYPE_KEY: { int ac = AKeyEvent_getAction(event); - switch(ac) { + switch (ac) { case AKEY_EVENT_ACTION_DOWN: { int32_t code = AKeyEvent_getKeyCode(event); - if (code==AKEYCODE_BACK) { + if (code == AKEYCODE_BACK) { //AInputQueue_finishEvent(AInputQueue* queue, AInputEvent* event, int handled); if (engine->os) engine->os->main_loop_request_quit(); return 1; - } - } break; case AKEY_EVENT_ACTION_UP: { - } break; } - } break; case AINPUT_EVENT_TYPE_MOTION: { - Vector<OS_Android::TouchPos> touchvec; int pc = AMotionEvent_getPointerCount(event); touchvec.resize(pc); - for(int i=0;i<pc;i++) { + for (int i = 0; i < pc; i++) { - touchvec[i].pos.x=AMotionEvent_getX(event,i); - touchvec[i].pos.y=AMotionEvent_getY(event,i); - touchvec[i].id=AMotionEvent_getPointerId(event,i); + touchvec[i].pos.x = AMotionEvent_getX(event, i); + touchvec[i].pos.y = AMotionEvent_getY(event, i); + touchvec[i].id = AMotionEvent_getPointerId(event, i); } - //System.out.printf("gaction: %d\n",event.getAction()); - int pidx=(AMotionEvent_getAction(event)&AMOTION_EVENT_ACTION_POINTER_INDEX_MASK)>>8; - switch(AMotionEvent_getAction(event)&AMOTION_EVENT_ACTION_MASK) { + int pidx = (AMotionEvent_getAction(event) & AMOTION_EVENT_ACTION_POINTER_INDEX_MASK) >> 8; + switch (AMotionEvent_getAction(event) & AMOTION_EVENT_ACTION_MASK) { case AMOTION_EVENT_ACTION_DOWN: { - engine->os->process_touch(0,0,touchvec); + engine->os->process_touch(0, 0, touchvec); - //System.out.printf("action down at: %f,%f\n", event.getX(),event.getY()); + //System.out.printf("action down at: %f,%f\n", event.getX(),event.getY()); } break; case AMOTION_EVENT_ACTION_MOVE: { - engine->os->process_touch(1,0,touchvec); - //for(int i=0;i<event.getPointerCount();i++) { - // System.out.printf("%d - moved to: %f,%f\n",i, event.getX(i),event.getY(i)); - //} + engine->os->process_touch(1, 0, touchvec); + //for(int i=0;i<event.getPointerCount();i++) { + // System.out.printf("%d - moved to: %f,%f\n",i, event.getX(i),event.getY(i)); + //} } break; case AMOTION_EVENT_ACTION_POINTER_UP: { - engine->os->process_touch(4,pidx,touchvec); - //System.out.printf("%d - s.up at: %f,%f\n",pointer_idx, event.getX(pointer_idx),event.getY(pointer_idx)); + engine->os->process_touch(4, pidx, touchvec); + //System.out.printf("%d - s.up at: %f,%f\n",pointer_idx, event.getX(pointer_idx),event.getY(pointer_idx)); } break; case AMOTION_EVENT_ACTION_POINTER_DOWN: { - engine->os->process_touch(3,pidx,touchvec); - //System.out.printf("%d - s.down at: %f,%f\n",pointer_idx, event.getX(pointer_idx),event.getY(pointer_idx)); + engine->os->process_touch(3, pidx, touchvec); + //System.out.printf("%d - s.down at: %f,%f\n",pointer_idx, event.getX(pointer_idx),event.getY(pointer_idx)); } break; case AMOTION_EVENT_ACTION_CANCEL: case AMOTION_EVENT_ACTION_UP: { - engine->os->process_touch(2,0,touchvec); - //for(int i=0;i<event.getPointerCount();i++) { - // System.out.printf("%d - up! %f,%f\n",i, event.getX(i),event.getY(i)); - //} + engine->os->process_touch(2, 0, touchvec); + //for(int i=0;i<event.getPointerCount();i++) { + // System.out.printf("%d - up! %f,%f\n",i, event.getX(i),event.getY(i)); + //} } break; } return 1; } break; - } - return 0; + return 0; } /** * Process the next main command. */ -static void _gfx_init(void *ud,bool p_gl2) { +static void _gfx_init(void *ud, bool p_gl2) { - struct engine* engine = (struct engine*)ud; - engine_init_display(engine,p_gl2); + struct engine *engine = (struct engine *)ud; + engine_init_display(engine, p_gl2); } -static void engine_handle_cmd(struct android_app* app, int32_t cmd) { - struct engine* engine = (struct engine*)app->userData; - // LOGI("**** CMD %i\n",cmd); - switch (cmd) { - case APP_CMD_SAVE_STATE: - // The system has asked us to save our current state. Do so. - //engine->app->savedState = malloc(sizeof(struct saved_state)); - //*((struct saved_state*)engine->app->savedState) = engine->state; - //engine->app->savedStateSize = sizeof(struct saved_state); - break; - case APP_CMD_CONFIG_CHANGED: - case APP_CMD_WINDOW_RESIZED: { +static void engine_handle_cmd(struct android_app *app, int32_t cmd) { + struct engine *engine = (struct engine *)app->userData; + // LOGI("**** CMD %i\n",cmd); + switch (cmd) { + case APP_CMD_SAVE_STATE: + // The system has asked us to save our current state. Do so. + //engine->app->savedState = malloc(sizeof(struct saved_state)); + //*((struct saved_state*)engine->app->savedState) = engine->state; + //engine->app->savedStateSize = sizeof(struct saved_state); + break; + case APP_CMD_CONFIG_CHANGED: + case APP_CMD_WINDOW_RESIZED: { #if 0 // android blows @@ -606,26 +574,22 @@ static void engine_handle_cmd(struct android_app* app, int32_t cmd) { } #else - if (engine->display_active) { + if (engine->display_active) { - - EGLint w,h; - eglQuerySurface(engine->display, engine->surface, EGL_WIDTH, &w); - eglQuerySurface(engine->display, engine->surface, EGL_HEIGHT, &h); - // if (w==engine->os->get_video_mode().width && h==engine->os->get_video_mode().height) + EGLint w, h; + eglQuerySurface(engine->display, engine->surface, EGL_WIDTH, &w); + eglQuerySurface(engine->display, engine->surface, EGL_HEIGHT, &h); + // if (w==engine->os->get_video_mode().width && h==engine->os->get_video_mode().height) // break; - engine_term_display(engine); - - - } - + engine_term_display(engine); + } - engine->os->reload_gfx(); - engine_draw_frame(engine); - engine->animating=1; + engine->os->reload_gfx(); + engine_draw_frame(engine); + engine->animating = 1; - /* +/* EGLint w,h; eglQuerySurface(engine->display, engine->surface, EGL_WIDTH, &w); eglQuerySurface(engine->display, engine->surface, EGL_HEIGHT, &h); @@ -636,309 +600,285 @@ static void engine_handle_cmd(struct android_app* app, int32_t cmd) { #endif - } break; - case APP_CMD_INIT_WINDOW: - //The window is being shown, get it ready. - // LOGI("INIT WINDOW"); - if (engine->app->window != NULL) { + } break; + case APP_CMD_INIT_WINDOW: + //The window is being shown, get it ready. + // LOGI("INIT WINDOW"); + if (engine->app->window != NULL) { - if (engine->os==NULL) { + if (engine->os == NULL) { - //do initialization here, when there's OpenGL! hackish but the only way - engine->os = new OS_Android(_gfx_init,engine); + //do initialization here, when there's OpenGL! hackish but the only way + engine->os = new OS_Android(_gfx_init, engine); - // char *args[]={"-test","gui",NULL}; - __android_log_print(ANDROID_LOG_INFO,"godot","pre asdasd setup..."); + // char *args[]={"-test","gui",NULL}; + __android_log_print(ANDROID_LOG_INFO, "godot", "pre asdasd setup..."); #if 0 Error err = Main::setup("apk",2,args); #else - Error err = Main::setup("apk",0,NULL); - - String modules = Globals::get_singleton()->get("android/modules"); - Vector<String> mods = modules.split(",",false); - mods.push_back("GodotOS"); - __android_log_print(ANDROID_LOG_INFO,"godot","mod count: %i",mods.size()); - - if (mods.size()) { + Error err = Main::setup("apk", 0, NULL); - jclass activityClass = engine->jni->FindClass("android/app/NativeActivity"); + String modules = Globals::get_singleton()->get("android/modules"); + Vector<String> mods = modules.split(",", false); + mods.push_back("GodotOS"); + __android_log_print(ANDROID_LOG_INFO, "godot", "mod count: %i", mods.size()); - jmethodID getClassLoader = engine->jni->GetMethodID(activityClass,"getClassLoader", "()Ljava/lang/ClassLoader;"); + if (mods.size()) { - jobject cls = engine->jni->CallObjectMethod(app->activity->clazz, getClassLoader); + jclass activityClass = engine->jni->FindClass("android/app/NativeActivity"); - jclass classLoader = engine->jni->FindClass("java/lang/ClassLoader"); + jmethodID getClassLoader = engine->jni->GetMethodID(activityClass, "getClassLoader", "()Ljava/lang/ClassLoader;"); - jmethodID findClass = engine->jni->GetMethodID(classLoader, "loadClass", "(Ljava/lang/String;)Ljava/lang/Class;"); + jobject cls = engine->jni->CallObjectMethod(app->activity->clazz, getClassLoader); + jclass classLoader = engine->jni->FindClass("java/lang/ClassLoader"); - static JNINativeMethod methods[] = { - {"registerSingleton", "(Ljava/lang/String;Ljava/lang/Object;)V",(void *)&Java_org_godotengine_godot_Godot_registerSingleton}, - {"registerMethod", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;)V",(void *)&Java_org_godotengine_godot_Godot_registerMethod}, - {"getGlobal", "(Ljava/lang/String;)Ljava/lang/String;", (void *)&Java_org_godotengine_godot_Godot_getGlobal}, - }; + jmethodID findClass = engine->jni->GetMethodID(classLoader, "loadClass", "(Ljava/lang/String;)Ljava/lang/Class;"); - jstring gstrClassName = engine->jni->NewStringUTF("org/godotengine/godot/Godot"); - jclass GodotClass = (jclass)engine->jni->CallObjectMethod(cls, findClass, gstrClassName); + static JNINativeMethod methods[] = { + { "registerSingleton", "(Ljava/lang/String;Ljava/lang/Object;)V", (void *)&Java_org_godotengine_godot_Godot_registerSingleton }, + { "registerMethod", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;[Ljava/lang/String;)V", (void *)&Java_org_godotengine_godot_Godot_registerMethod }, + { "getGlobal", "(Ljava/lang/String;)Ljava/lang/String;", (void *)&Java_org_godotengine_godot_Godot_getGlobal }, + }; - __android_log_print(ANDROID_LOG_INFO,"godot","godot ****^*^*?^*^*class data %x",GodotClass); + jstring gstrClassName = engine->jni->NewStringUTF("org/godotengine/godot/Godot"); + jclass GodotClass = (jclass)engine->jni->CallObjectMethod(cls, findClass, gstrClassName); - engine->jni->RegisterNatives(GodotClass,methods,sizeof(methods)/sizeof(methods[0])); + __android_log_print(ANDROID_LOG_INFO, "godot", "godot ****^*^*?^*^*class data %x", GodotClass); - for (int i=0;i<mods.size();i++) { + engine->jni->RegisterNatives(GodotClass, methods, sizeof(methods) / sizeof(methods[0])); - String m = mods[i]; - //jclass singletonClass = engine->jni->FindClass(m.utf8().get_data()); + for (int i = 0; i < mods.size(); i++) { - jstring strClassName = engine->jni->NewStringUTF(m.utf8().get_data()); - jclass singletonClass = (jclass)engine->jni->CallObjectMethod(cls, findClass, strClassName); + String m = mods[i]; + //jclass singletonClass = engine->jni->FindClass(m.utf8().get_data()); - __android_log_print(ANDROID_LOG_INFO,"godot","****^*^*?^*^*class data %x",singletonClass); - jmethodID initialize = engine->jni->GetStaticMethodID(singletonClass, "initialize", "(Landroid/app/Activity;)Lorg/godotengine/godot/Godot$SingletonBase;"); - - - jobject obj = engine->jni->CallStaticObjectMethod(singletonClass,initialize,app->activity->clazz); - __android_log_print(ANDROID_LOG_INFO,"godot","****^*^*?^*^*class instance %x",obj); - jobject gob = engine->jni->NewGlobalRef(obj); + jstring strClassName = engine->jni->NewStringUTF(m.utf8().get_data()); + jclass singletonClass = (jclass)engine->jni->CallObjectMethod(cls, findClass, strClassName); + __android_log_print(ANDROID_LOG_INFO, "godot", "****^*^*?^*^*class data %x", singletonClass); + jmethodID initialize = engine->jni->GetStaticMethodID(singletonClass, "initialize", "(Landroid/app/Activity;)Lorg/godotengine/godot/Godot$SingletonBase;"); + jobject obj = engine->jni->CallStaticObjectMethod(singletonClass, initialize, app->activity->clazz); + __android_log_print(ANDROID_LOG_INFO, "godot", "****^*^*?^*^*class instance %x", obj); + jobject gob = engine->jni->NewGlobalRef(obj); + } } - } - #endif + if (!Main::start()) + return; //should exit instead and print the error - if (!Main::start()) - return; //should exit instead and print the error + engine->os->main_loop_begin(); + } else { + //i guess recreate resources? + engine->os->reload_gfx(); + } - engine->os->main_loop_begin(); - } else { - //i guess recreate resources? - engine->os->reload_gfx(); + engine->animating = 1; + engine_draw_frame(engine); } - - - engine->animating=1; + break; + case APP_CMD_TERM_WINDOW: + // The window is being hidden or closed, clean it up. + // LOGI("TERM WINDOW"); + engine_term_display(engine); + break; + case APP_CMD_GAINED_FOCUS: + // When our app gains focus, we start monitoring the accelerometer. + if (engine->accelerometerSensor != NULL) { + ASensorEventQueue_enableSensor(engine->sensorEventQueue, + engine->accelerometerSensor); + // We'd like to get 60 events per second (in us). + ASensorEventQueue_setEventRate(engine->sensorEventQueue, + engine->accelerometerSensor, (1000L / 60) * 1000); + } + // Also start monitoring the magnetometer. + if (engine->magnetometerSensor != NULL) { + ASensorEventQueue_enableSensor(engine->sensorEventQueue, + engine->magnetometerSensor); + // We'd like to get 60 events per second (in us). + ASensorEventQueue_setEventRate(engine->sensorEventQueue, + engine->magnetometerSensor, (1000L / 60) * 1000); + } + // And the gyroscope. + if (engine->gyroscopeSensor != NULL) { + ASensorEventQueue_enableSensor(engine->sensorEventQueue, + engine->gyroscopeSensor); + // We'd like to get 60 events per second (in us). + ASensorEventQueue_setEventRate(engine->sensorEventQueue, + engine->gyroscopeSensor, (1000L / 60) * 1000); + } + engine->animating = 1; + break; + case APP_CMD_LOST_FOCUS: + // When our app loses focus, we stop monitoring the sensors. + // This is to avoid consuming battery while not being used. + if (engine->accelerometerSensor != NULL) { + ASensorEventQueue_disableSensor(engine->sensorEventQueue, + engine->accelerometerSensor); + } + if (engine->magnetometerSensor != NULL) { + ASensorEventQueue_disableSensor(engine->sensorEventQueue, + engine->magnetometerSensor); + } + if (engine->gyroscopeSensor != NULL) { + ASensorEventQueue_disableSensor(engine->sensorEventQueue, + engine->gyroscopeSensor); + } + // Also stop animating. + engine->animating = 0; engine_draw_frame(engine); - } - break; - case APP_CMD_TERM_WINDOW: - // The window is being hidden or closed, clean it up. - // LOGI("TERM WINDOW"); - engine_term_display(engine); - break; - case APP_CMD_GAINED_FOCUS: - // When our app gains focus, we start monitoring the accelerometer. - if (engine->accelerometerSensor != NULL) { - ASensorEventQueue_enableSensor(engine->sensorEventQueue, - engine->accelerometerSensor); - // We'd like to get 60 events per second (in us). - ASensorEventQueue_setEventRate(engine->sensorEventQueue, - engine->accelerometerSensor, (1000L/60)*1000); - - } - // Also start monitoring the magnetometer. - if (engine->magnetometerSensor != NULL) { - ASensorEventQueue_enableSensor(engine->sensorEventQueue, - engine->magnetometerSensor); - // We'd like to get 60 events per second (in us). - ASensorEventQueue_setEventRate(engine->sensorEventQueue, - engine->magnetometerSensor, (1000L/60)*1000); - - } - // And the gyroscope. - if (engine->gyroscopeSensor != NULL) { - ASensorEventQueue_enableSensor(engine->sensorEventQueue, - engine->gyroscopeSensor); - // We'd like to get 60 events per second (in us). - ASensorEventQueue_setEventRate(engine->sensorEventQueue, - engine->gyroscopeSensor, (1000L/60)*1000); - - } - engine->animating = 1; - break; - case APP_CMD_LOST_FOCUS: - // When our app loses focus, we stop monitoring the sensors. - // This is to avoid consuming battery while not being used. - if (engine->accelerometerSensor != NULL) { - ASensorEventQueue_disableSensor(engine->sensorEventQueue, - engine->accelerometerSensor); - } - if (engine->magnetometerSensor != NULL) { - ASensorEventQueue_disableSensor(engine->sensorEventQueue, - engine->magnetometerSensor); - } - if (engine->gyroscopeSensor != NULL) { - ASensorEventQueue_disableSensor(engine->sensorEventQueue, - engine->gyroscopeSensor); - } - // Also stop animating. - engine->animating = 0; - engine_draw_frame(engine); - break; - } + break; + } } -void android_main(struct android_app* state) { - struct engine engine; - // Make sure glue isn't stripped. - app_dummy(); - - memset(&engine, 0, sizeof(engine)); - state->userData = &engine; - state->onAppCmd = engine_handle_cmd; - state->onInputEvent = engine_handle_input; - engine.app = state; - engine.requested_quit=false; - engine.os=NULL; - engine.display_active=false; +void android_main(struct android_app *state) { + struct engine engine; + // Make sure glue isn't stripped. + app_dummy(); - FileAccessAndroid::asset_manager=state->activity->assetManager; + memset(&engine, 0, sizeof(engine)); + state->userData = &engine; + state->onAppCmd = engine_handle_cmd; + state->onInputEvent = engine_handle_input; + engine.app = state; + engine.requested_quit = false; + engine.os = NULL; + engine.display_active = false; - // Prepare to monitor sensors - engine.sensorManager = ASensorManager_getInstance(); - engine.accelerometerSensor = ASensorManager_getDefaultSensor(engine.sensorManager, - ASENSOR_TYPE_ACCELEROMETER); - engine.magnetometerSensor = ASensorManager_getDefaultSensor(engine.sensorManager, - ASENSOR_TYPE_MAGNETIC_FIELD); - engine.gyroscopeSensor = ASensorManager_getDefaultSensor(engine.sensorManager, - ASENSOR_TYPE_GYROSCOPE); - engine.sensorEventQueue = ASensorManager_createEventQueue(engine.sensorManager, - state->looper, LOOPER_ID_USER, NULL, NULL); + FileAccessAndroid::asset_manager = state->activity->assetManager; + // Prepare to monitor sensors + engine.sensorManager = ASensorManager_getInstance(); + engine.accelerometerSensor = ASensorManager_getDefaultSensor(engine.sensorManager, + ASENSOR_TYPE_ACCELEROMETER); + engine.magnetometerSensor = ASensorManager_getDefaultSensor(engine.sensorManager, + ASENSOR_TYPE_MAGNETIC_FIELD); + engine.gyroscopeSensor = ASensorManager_getDefaultSensor(engine.sensorManager, + ASENSOR_TYPE_GYROSCOPE); + engine.sensorEventQueue = ASensorManager_createEventQueue(engine.sensorManager, + state->looper, LOOPER_ID_USER, NULL, NULL); - ANativeActivity_setWindowFlags(state->activity,AWINDOW_FLAG_FULLSCREEN|AWINDOW_FLAG_KEEP_SCREEN_ON,0); + ANativeActivity_setWindowFlags(state->activity, AWINDOW_FLAG_FULLSCREEN | AWINDOW_FLAG_KEEP_SCREEN_ON, 0); state->activity->vm->AttachCurrentThread(&engine.jni, NULL); + // loop waiting for stuff to do. + while (1) { + // Read all pending events. + int ident; + int events; + struct android_poll_source *source; - // loop waiting for stuff to do. - - while (1) { - // Read all pending events. - int ident; - int events; - struct android_poll_source* source; - - // If not animating, we will block forever waiting for events. - // If animating, we loop until all events are read, then continue - // to draw the next frame of animation. - - int nullmax=50; - while ((ident=ALooper_pollAll(engine.animating ? 0 : -1, NULL, &events, - (void**)&source)) >= 0) { - - // Process this event. + // If not animating, we will block forever waiting for events. + // If animating, we loop until all events are read, then continue + // to draw the next frame of animation. - if (source != NULL) { - // LOGI("process\n"); - source->process(state, source); - } else { - nullmax--; - if (nullmax<0) - break; - } - - // If a sensor has data, process it now. - // LOGI("events\n"); - if (ident == LOOPER_ID_USER) { - if (engine.accelerometerSensor != NULL || engine.magnetometerSensor != NULL || engine.gyroscopeSensor != NULL) { - ASensorEvent event; - while (ASensorEventQueue_getEvents(engine.sensorEventQueue, - &event, 1) > 0) { - - - if (engine.os) { - if (event.acceleration != NULL) { - engine.os->process_accelerometer(Vector3(event.acceleration.x, event.acceleration.y, - event.acceleration.z)); - } - if (event.magnetic != NULL) { - engine.os->process_magnetometer(Vector3(event.magnetic.x, event.magnetic.y, - event.magnetic.z)); - } - if (event.vector != NULL) { - engine.os->process_gyroscope(Vector3(event.vector.x, event.vector.y, - event.vector.z)); - } - } + int nullmax = 50; + while ((ident = ALooper_pollAll(engine.animating ? 0 : -1, NULL, &events, + (void **)&source)) >= 0) { - } - } - } + // Process this event. - // Check if we are exiting. - if (state->destroyRequested != 0) { - if (engine.os) { - engine.os->main_loop_request_quit(); - } - state->destroyRequested=0; - } - - if (engine.requested_quit) { - engine_term_display(&engine); - exit(0); - return; - } + if (source != NULL) { + // LOGI("process\n"); + source->process(state, source); + } else { + nullmax--; + if (nullmax < 0) + break; + } -// LOGI("end\n"); + // If a sensor has data, process it now. + // LOGI("events\n"); + if (ident == LOOPER_ID_USER) { + if (engine.accelerometerSensor != NULL || engine.magnetometerSensor != NULL || engine.gyroscopeSensor != NULL) { + ASensorEvent event; + while (ASensorEventQueue_getEvents(engine.sensorEventQueue, + &event, 1) > 0) { + if (engine.os) { + if (event.acceleration != NULL) { + engine.os->process_accelerometer(Vector3(event.acceleration.x, event.acceleration.y, + event.acceleration.z)); + } + if (event.magnetic != NULL) { + engine.os->process_magnetometer(Vector3(event.magnetic.x, event.magnetic.y, + event.magnetic.z)); + } + if (event.vector != NULL) { + engine.os->process_gyroscope(Vector3(event.vector.x, event.vector.y, + event.vector.z)); + } + } + } + } + } - } + // Check if we are exiting. + if (state->destroyRequested != 0) { + if (engine.os) { + engine.os->main_loop_request_quit(); + } + state->destroyRequested = 0; + } -// LOGI("engine animating? %i\n",engine.animating); + if (engine.requested_quit) { + engine_term_display(&engine); + exit(0); + return; + } - if (engine.animating) { - //do os render + // LOGI("end\n"); + } - engine_draw_frame(&engine); - //LOGI("TERM WINDOW"); + // LOGI("engine animating? %i\n",engine.animating); - } - } + if (engine.animating) { + //do os render + engine_draw_frame(&engine); + //LOGI("TERM WINDOW"); + } + } } +JNIEXPORT void JNICALL Java_org_godotengine_godot_Godot_registerSingleton(JNIEnv *env, jobject obj, jstring name, jobject p_object) { - - -JNIEXPORT void JNICALL Java_org_godotengine_godot_Godot_registerSingleton(JNIEnv * env, jobject obj, jstring name,jobject p_object){ - - String singname = env->GetStringUTFChars( name, NULL ); - JNISingleton *s = memnew( JNISingleton ); + String singname = env->GetStringUTFChars(name, NULL); + JNISingleton *s = memnew(JNISingleton); s->update_env(env); s->set_instance(env->NewGlobalRef(p_object)); - jni_singletons[singname]=s; - - Globals::get_singleton()->add_singleton(Globals::Singleton(singname,s)); + jni_singletons[singname] = s; + Globals::get_singleton()->add_singleton(Globals::Singleton(singname, s)); } - -static Variant::Type get_jni_type(const String& p_type) { +static Variant::Type get_jni_type(const String &p_type) { static struct { const char *name; Variant::Type type; - } _type_to_vtype[]={ - {"void",Variant::NIL}, - {"boolean",Variant::BOOL}, - {"int",Variant::INT}, - {"float",Variant::REAL}, - {"java.lang.String",Variant::STRING}, - {"[I",Variant::INT_ARRAY}, - {"[F",Variant::REAL_ARRAY}, - {"[Ljava.lang.String;",Variant::STRING_ARRAY}, - {NULL,Variant::NIL} + } _type_to_vtype[] = { + { "void", Variant::NIL }, + { "boolean", Variant::BOOL }, + { "int", Variant::INT }, + { "float", Variant::REAL }, + { "java.lang.String", Variant::STRING }, + { "[I", Variant::INT_ARRAY }, + { "[F", Variant::REAL_ARRAY }, + { "[Ljava.lang.String;", Variant::STRING_ARRAY }, + { NULL, Variant::NIL } }; - int idx=0; + int idx = 0; while (_type_to_vtype[idx].name) { - if (p_type==_type_to_vtype[idx].name) + if (p_type == _type_to_vtype[idx].name) return _type_to_vtype[idx].type; idx++; @@ -947,88 +887,78 @@ static Variant::Type get_jni_type(const String& p_type) { return Variant::NIL; } - -static const char* get_jni_sig(const String& p_type) { +static const char *get_jni_sig(const String &p_type) { static struct { const char *name; const char *sig; - } _type_to_vtype[]={ - {"void","V"}, - {"boolean","Z"}, - {"int","I"}, - {"float","F"}, - {"java.lang.String","Ljava/lang/String;"}, - {"[I","[I"}, - {"[F","[F"}, - {"[Ljava.lang.String;","[Ljava/lang/String;"}, - {NULL,"V"} + } _type_to_vtype[] = { + { "void", "V" }, + { "boolean", "Z" }, + { "int", "I" }, + { "float", "F" }, + { "java.lang.String", "Ljava/lang/String;" }, + { "[I", "[I" }, + { "[F", "[F" }, + { "[Ljava.lang.String;", "[Ljava/lang/String;" }, + { NULL, "V" } }; - int idx=0; + int idx = 0; while (_type_to_vtype[idx].name) { - if (p_type==_type_to_vtype[idx].name) + if (p_type == _type_to_vtype[idx].name) return _type_to_vtype[idx].sig; idx++; } - return ""; } -JNIEXPORT jstring JNICALL Java_org_godotengine_godot_Godot_getGlobal(JNIEnv * env, jobject obj, jstring path) { +JNIEXPORT jstring JNICALL Java_org_godotengine_godot_Godot_getGlobal(JNIEnv *env, jobject obj, jstring path) { - String js = env->GetStringUTFChars( path, NULL ); + String js = env->GetStringUTFChars(path, NULL); return env->NewStringUTF(Globals::get_singleton()->get(js).operator String().utf8().get_data()); - - } +JNIEXPORT void JNICALL Java_org_godotengine_godot_Godot_registerMethod(JNIEnv *env, jobject obj, jstring sname, jstring name, jstring ret, jobjectArray args) { - -JNIEXPORT void JNICALL Java_org_godotengine_godot_Godot_registerMethod(JNIEnv * env, jobject obj, jstring sname, jstring name, jstring ret, jobjectArray args){ - - String singname = env->GetStringUTFChars( sname, NULL ); + String singname = env->GetStringUTFChars(sname, NULL); ERR_FAIL_COND(!jni_singletons.has(singname)); JNISingleton *s = jni_singletons.get(singname); - - String mname = env->GetStringUTFChars( name, NULL ); - String retval = env->GetStringUTFChars( ret, NULL ); + String mname = env->GetStringUTFChars(name, NULL); + String retval = env->GetStringUTFChars(ret, NULL); Vector<Variant::Type> types; - String cs="("; - + String cs = "("; int stringCount = env->GetArrayLength(args); - print_line("Singl: "+singname+" Method: "+mname+" RetVal: "+retval); - for (int i=0; i<stringCount; i++) { + print_line("Singl: " + singname + " Method: " + mname + " RetVal: " + retval); + 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)); + cs += get_jni_sig(String(rawString)); } - cs+=")"; - cs+=get_jni_sig(retval); + cs += ")"; + cs += get_jni_sig(retval); jclass cls = env->GetObjectClass(s->get_instance()); - print_line("METHOD: "+mname+" sig: "+cs); + print_line("METHOD: " + mname + " sig: " + cs); jmethodID mid = env->GetMethodID(cls, mname.ascii().get_data(), cs.ascii().get_data()); if (!mid) { - print_line("FAILED GETTING METHOID "+mname); + print_line("FAILED GETTING METHOID " + mname); } - s->add_method(mname,mid,types,get_jni_type(retval)); - - + s->add_method(mname, mid, types, get_jni_type(retval)); } #endif diff --git a/platform/android/java_class_wrapper.cpp b/platform/android/java_class_wrapper.cpp index 26123b10a..b619525d4 100644 --- a/platform/android/java_class_wrapper.cpp +++ b/platform/android/java_class_wrapper.cpp @@ -29,56 +29,55 @@ #include "java_class_wrapper.h" #include "thread_jandroid.h" +bool JavaClass::_call_method(JavaObject *p_instance, const StringName &p_method, const Variant **p_args, int p_argcount, Variant::CallError &r_error, Variant &ret) { -bool JavaClass::_call_method(JavaObject* p_instance,const StringName& p_method,const Variant** p_args,int p_argcount,Variant::CallError &r_error,Variant& ret) { - - Map<StringName,List<MethodInfo> >::Element *M=methods.find(p_method); + Map<StringName, List<MethodInfo> >::Element *M = methods.find(p_method); if (!M) return false; JNIEnv *env = ThreadAndroid::get_env(); - MethodInfo *method=NULL; - for (List<MethodInfo>::Element *E=M->get().front();E;E=E->next()) { + MethodInfo *method = NULL; + for (List<MethodInfo>::Element *E = M->get().front(); E; E = E->next()) { if (!p_instance && !E->get()._static) { - r_error.error=Variant::CallError::CALL_ERROR_INSTANCE_IS_NULL; + r_error.error = Variant::CallError::CALL_ERROR_INSTANCE_IS_NULL; continue; } int pc = E->get().param_types.size(); - if (pc>p_argcount) { + if (pc > p_argcount) { - r_error.error=Variant::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS; - r_error.argument=pc; + r_error.error = Variant::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS; + r_error.argument = pc; continue; } - if (pc<p_argcount) { + if (pc < p_argcount) { - r_error.error=Variant::CallError::CALL_ERROR_TOO_MANY_ARGUMENTS; - r_error.argument=pc; + r_error.error = Variant::CallError::CALL_ERROR_TOO_MANY_ARGUMENTS; + r_error.argument = pc; continue; } - uint32_t *ptypes=E->get().param_types.ptr(); - bool valid=true; + uint32_t *ptypes = E->get().param_types.ptr(); + bool valid = true; - for(int i=0;i<pc;i++) { + for (int i = 0; i < pc; i++) { - Variant::Type arg_expected=Variant::NIL; - switch(ptypes[i]) { + Variant::Type arg_expected = Variant::NIL; + switch (ptypes[i]) { case ARG_TYPE_VOID: { //bug? } break; case ARG_TYPE_BOOLEAN: { - if (p_args[i]->get_type()!=Variant::BOOL) - arg_expected=Variant::BOOL; + if (p_args[i]->get_type() != Variant::BOOL) + arg_expected = Variant::BOOL; } break; - case ARG_NUMBER_CLASS_BIT|ARG_TYPE_BYTE: - case ARG_NUMBER_CLASS_BIT|ARG_TYPE_CHAR: - case ARG_NUMBER_CLASS_BIT|ARG_TYPE_SHORT: - case ARG_NUMBER_CLASS_BIT|ARG_TYPE_INT: - case ARG_NUMBER_CLASS_BIT|ARG_TYPE_LONG: + case ARG_NUMBER_CLASS_BIT | ARG_TYPE_BYTE: + case ARG_NUMBER_CLASS_BIT | ARG_TYPE_CHAR: + case ARG_NUMBER_CLASS_BIT | ARG_TYPE_SHORT: + case ARG_NUMBER_CLASS_BIT | ARG_TYPE_INT: + case ARG_NUMBER_CLASS_BIT | ARG_TYPE_LONG: case ARG_TYPE_BYTE: case ARG_TYPE_CHAR: case ARG_TYPE_SHORT: @@ -86,127 +85,119 @@ bool JavaClass::_call_method(JavaObject* p_instance,const StringName& p_method,c case ARG_TYPE_LONG: { if (!p_args[i]->is_num()) - arg_expected=Variant::INT; + arg_expected = Variant::INT; } break; - case ARG_NUMBER_CLASS_BIT|ARG_TYPE_FLOAT: - case ARG_NUMBER_CLASS_BIT|ARG_TYPE_DOUBLE: + case ARG_NUMBER_CLASS_BIT | ARG_TYPE_FLOAT: + case ARG_NUMBER_CLASS_BIT | ARG_TYPE_DOUBLE: case ARG_TYPE_FLOAT: case ARG_TYPE_DOUBLE: { if (!p_args[i]->is_num()) - arg_expected=Variant::REAL; + arg_expected = Variant::REAL; } break; case ARG_TYPE_STRING: { - if (p_args[i]->get_type()!=Variant::STRING) - arg_expected=Variant::STRING; + if (p_args[i]->get_type() != Variant::STRING) + arg_expected = Variant::STRING; } break; case ARG_TYPE_CLASS: { - if (p_args[i]->get_type()!=Variant::OBJECT) - arg_expected=Variant::OBJECT; + if (p_args[i]->get_type() != Variant::OBJECT) + arg_expected = Variant::OBJECT; else { Ref<Reference> ref = *p_args[i]; if (!ref.is_null()) { - if (ref->cast_to<JavaObject>() ) { + if (ref->cast_to<JavaObject>()) { - Ref<JavaObject> jo=ref; + Ref<JavaObject> jo = ref; //could be faster jclass c = env->FindClass(E->get().param_sigs[i].operator String().utf8().get_data()); - if (!c || !env->IsInstanceOf(jo->instance,c)) { + if (!c || !env->IsInstanceOf(jo->instance, c)) { - arg_expected=Variant::OBJECT; + arg_expected = Variant::OBJECT; } else { //ok } } else { - arg_expected=Variant::OBJECT; + arg_expected = Variant::OBJECT; } - } } } break; default: { - if (p_args[i]->get_type()!=Variant::ARRAY) - arg_expected=Variant::ARRAY; + if (p_args[i]->get_type() != Variant::ARRAY) + arg_expected = Variant::ARRAY; } break; - } - if (arg_expected!=Variant::NIL) { - r_error.error=Variant::CallError::CALL_ERROR_INVALID_ARGUMENT; - r_error.argument=i; - r_error.expected=arg_expected; - valid=false; + if (arg_expected != Variant::NIL) { + r_error.error = Variant::CallError::CALL_ERROR_INVALID_ARGUMENT; + r_error.argument = i; + r_error.expected = arg_expected; + valid = false; break; - } - } if (!valid) continue; - - method=&E->get(); + method = &E->get(); break; - } if (!method) return true; //no version convinces + r_error.error = Variant::CallError::CALL_OK; - - r_error.error=Variant::CallError::CALL_OK; - - jvalue *argv=NULL; + jvalue *argv = NULL; if (method->param_types.size()) { - argv=(jvalue*)alloca( sizeof(jvalue)*method->param_types.size() ); + argv = (jvalue *)alloca(sizeof(jvalue) * method->param_types.size()); } List<jobject> to_free; - for(int i=0;i<method->param_types.size();i++) { + for (int i = 0; i < method->param_types.size(); i++) { - switch(method->param_types[i]) { - case ARG_TYPE_VOID: { + switch (method->param_types[i]) { + case ARG_TYPE_VOID: { //can't happen - argv[i].l=NULL; //I hope this works + argv[i].l = NULL; //I hope this works } break; case ARG_TYPE_BOOLEAN: { - argv[i].z=*p_args[i]; + argv[i].z = *p_args[i]; } break; case ARG_TYPE_BYTE: { - argv[i].b=*p_args[i]; + argv[i].b = *p_args[i]; } break; case ARG_TYPE_CHAR: { - argv[i].c=*p_args[i]; + argv[i].c = *p_args[i]; } break; case ARG_TYPE_SHORT: { - argv[i].s=*p_args[i]; + argv[i].s = *p_args[i]; } break; case ARG_TYPE_INT: { - argv[i].i=*p_args[i]; + argv[i].i = *p_args[i]; } break; case ARG_TYPE_LONG: { - argv[i].j=*p_args[i]; + argv[i].j = *p_args[i]; } break; case ARG_TYPE_FLOAT: { - argv[i].f=*p_args[i]; + argv[i].f = *p_args[i]; } break; case ARG_TYPE_DOUBLE: { - argv[i].d=*p_args[i]; + argv[i].d = *p_args[i]; } break; - case ARG_NUMBER_CLASS_BIT|ARG_TYPE_BOOLEAN: { + case ARG_NUMBER_CLASS_BIT | ARG_TYPE_BOOLEAN: { jclass bclass = env->FindClass("java/lang/Boolean"); jmethodID ctor = env->GetMethodID(bclass, "<init>", "(Z)V"); jvalue val; @@ -215,7 +206,7 @@ bool JavaClass::_call_method(JavaObject* p_instance,const StringName& p_method,c argv[i].l = obj; to_free.push_back(obj); } break; - case ARG_NUMBER_CLASS_BIT|ARG_TYPE_BYTE: { + case ARG_NUMBER_CLASS_BIT | ARG_TYPE_BYTE: { jclass bclass = env->FindClass("java/lang/Byte"); jmethodID ctor = env->GetMethodID(bclass, "<init>", "(B)V"); jvalue val; @@ -224,7 +215,7 @@ bool JavaClass::_call_method(JavaObject* p_instance,const StringName& p_method,c argv[i].l = obj; to_free.push_back(obj); } break; - case ARG_NUMBER_CLASS_BIT|ARG_TYPE_CHAR: { + case ARG_NUMBER_CLASS_BIT | ARG_TYPE_CHAR: { jclass bclass = env->FindClass("java/lang/Character"); jmethodID ctor = env->GetMethodID(bclass, "<init>", "(C)V"); jvalue val; @@ -233,7 +224,7 @@ bool JavaClass::_call_method(JavaObject* p_instance,const StringName& p_method,c argv[i].l = obj; to_free.push_back(obj); } break; - case ARG_NUMBER_CLASS_BIT|ARG_TYPE_SHORT: { + case ARG_NUMBER_CLASS_BIT | ARG_TYPE_SHORT: { jclass bclass = env->FindClass("java/lang/Short"); jmethodID ctor = env->GetMethodID(bclass, "<init>", "(S)V"); jvalue val; @@ -242,7 +233,7 @@ bool JavaClass::_call_method(JavaObject* p_instance,const StringName& p_method,c argv[i].l = obj; to_free.push_back(obj); } break; - case ARG_NUMBER_CLASS_BIT|ARG_TYPE_INT: { + case ARG_NUMBER_CLASS_BIT | ARG_TYPE_INT: { jclass bclass = env->FindClass("java/lang/Integer"); jmethodID ctor = env->GetMethodID(bclass, "<init>", "(I)V"); jvalue val; @@ -251,7 +242,7 @@ bool JavaClass::_call_method(JavaObject* p_instance,const StringName& p_method,c argv[i].l = obj; to_free.push_back(obj); } break; - case ARG_NUMBER_CLASS_BIT|ARG_TYPE_LONG: { + case ARG_NUMBER_CLASS_BIT | ARG_TYPE_LONG: { jclass bclass = env->FindClass("java/lang/Long"); jmethodID ctor = env->GetMethodID(bclass, "<init>", "(J)V"); jvalue val; @@ -260,7 +251,7 @@ bool JavaClass::_call_method(JavaObject* p_instance,const StringName& p_method,c argv[i].l = obj; to_free.push_back(obj); } break; - case ARG_NUMBER_CLASS_BIT|ARG_TYPE_FLOAT: { + case ARG_NUMBER_CLASS_BIT | ARG_TYPE_FLOAT: { jclass bclass = env->FindClass("java/lang/Float"); jmethodID ctor = env->GetMethodID(bclass, "<init>", "(F)V"); jvalue val; @@ -269,7 +260,7 @@ bool JavaClass::_call_method(JavaObject* p_instance,const StringName& p_method,c argv[i].l = obj; to_free.push_back(obj); } break; - case ARG_NUMBER_CLASS_BIT|ARG_TYPE_DOUBLE: { + case ARG_NUMBER_CLASS_BIT | ARG_TYPE_DOUBLE: { jclass bclass = env->FindClass("java/lang/Double"); jmethodID ctor = env->GetMethodID(bclass, "<init>", "(D)V"); jvalue val; @@ -281,217 +272,214 @@ bool JavaClass::_call_method(JavaObject* p_instance,const StringName& p_method,c case ARG_TYPE_STRING: { String s = *p_args[i]; jstring jStr = env->NewStringUTF(s.utf8().get_data()); - argv[i].l=jStr; + argv[i].l = jStr; to_free.push_back(jStr); } break; case ARG_TYPE_CLASS: { - Ref<JavaObject> jo=*p_args[i]; + Ref<JavaObject> jo = *p_args[i]; if (jo.is_valid()) { - argv[i].l=jo->instance; + argv[i].l = jo->instance; } else { - argv[i].l=NULL; //I hope this works + argv[i].l = NULL; //I hope this works } } break; - case ARG_ARRAY_BIT|ARG_TYPE_BOOLEAN: { + case ARG_ARRAY_BIT | ARG_TYPE_BOOLEAN: { Array arr = *p_args[i]; jbooleanArray a = env->NewBooleanArray(arr.size()); - for(int j=0;j<arr.size();j++) { + for (int j = 0; j < arr.size(); j++) { jboolean val = arr[j]; - env->SetBooleanArrayRegion(a,j,1,&val); + env->SetBooleanArrayRegion(a, j, 1, &val); } - argv[i].l=a; + argv[i].l = a; to_free.push_back(a); } break; - case ARG_ARRAY_BIT|ARG_TYPE_BYTE: { + case ARG_ARRAY_BIT | ARG_TYPE_BYTE: { Array arr = *p_args[i]; jbyteArray a = env->NewByteArray(arr.size()); - for(int j=0;j<arr.size();j++) { + for (int j = 0; j < arr.size(); j++) { jbyte val = arr[j]; - env->SetByteArrayRegion(a,j,1,&val); + env->SetByteArrayRegion(a, j, 1, &val); } - argv[i].l=a; + argv[i].l = a; to_free.push_back(a); - } break; - case ARG_ARRAY_BIT|ARG_TYPE_CHAR: { + case ARG_ARRAY_BIT | ARG_TYPE_CHAR: { Array arr = *p_args[i]; jcharArray a = env->NewCharArray(arr.size()); - for(int j=0;j<arr.size();j++) { + for (int j = 0; j < arr.size(); j++) { jchar val = arr[j]; - env->SetCharArrayRegion(a,j,1,&val); + env->SetCharArrayRegion(a, j, 1, &val); } - argv[i].l=a; + argv[i].l = a; to_free.push_back(a); } break; - case ARG_ARRAY_BIT|ARG_TYPE_SHORT: { + case ARG_ARRAY_BIT | ARG_TYPE_SHORT: { Array arr = *p_args[i]; jshortArray a = env->NewShortArray(arr.size()); - for(int j=0;j<arr.size();j++) { + for (int j = 0; j < arr.size(); j++) { jshort val = arr[j]; - env->SetShortArrayRegion(a,j,1,&val); + env->SetShortArrayRegion(a, j, 1, &val); } - argv[i].l=a; + argv[i].l = a; to_free.push_back(a); } break; - case ARG_ARRAY_BIT|ARG_TYPE_INT: { + case ARG_ARRAY_BIT | ARG_TYPE_INT: { Array arr = *p_args[i]; jintArray a = env->NewIntArray(arr.size()); - for(int j=0;j<arr.size();j++) { + for (int j = 0; j < arr.size(); j++) { jint val = arr[j]; - env->SetIntArrayRegion(a,j,1,&val); + env->SetIntArrayRegion(a, j, 1, &val); } - argv[i].l=a; + argv[i].l = a; to_free.push_back(a); } break; - case ARG_ARRAY_BIT|ARG_TYPE_LONG: { + case ARG_ARRAY_BIT | ARG_TYPE_LONG: { Array arr = *p_args[i]; jlongArray a = env->NewLongArray(arr.size()); - for(int j=0;j<arr.size();j++) { + for (int j = 0; j < arr.size(); j++) { jlong val = arr[j]; - env->SetLongArrayRegion(a,j,1,&val); + env->SetLongArrayRegion(a, j, 1, &val); } - argv[i].l=a; + argv[i].l = a; to_free.push_back(a); } break; - case ARG_ARRAY_BIT|ARG_TYPE_FLOAT: { + case ARG_ARRAY_BIT | ARG_TYPE_FLOAT: { Array arr = *p_args[i]; jfloatArray a = env->NewFloatArray(arr.size()); - for(int j=0;j<arr.size();j++) { + for (int j = 0; j < arr.size(); j++) { jfloat val = arr[j]; - env->SetFloatArrayRegion(a,j,1,&val); + env->SetFloatArrayRegion(a, j, 1, &val); } - argv[i].l=a; + argv[i].l = a; to_free.push_back(a); - } break; - case ARG_ARRAY_BIT|ARG_TYPE_DOUBLE: { + case ARG_ARRAY_BIT | ARG_TYPE_DOUBLE: { Array arr = *p_args[i]; jdoubleArray a = env->NewDoubleArray(arr.size()); - for(int j=0;j<arr.size();j++) { + for (int j = 0; j < arr.size(); j++) { jdouble val = arr[j]; - env->SetDoubleArrayRegion(a,j,1,&val); + env->SetDoubleArrayRegion(a, j, 1, &val); } - argv[i].l=a; + argv[i].l = a; to_free.push_back(a); } break; - case ARG_ARRAY_BIT|ARG_TYPE_STRING: { + case ARG_ARRAY_BIT | ARG_TYPE_STRING: { Array arr = *p_args[i]; - jobjectArray a = env->NewObjectArray(arr.size(),env->FindClass("java/lang/String"),NULL); - for(int j=0;j<arr.size();j++) { + jobjectArray a = env->NewObjectArray(arr.size(), env->FindClass("java/lang/String"), NULL); + for (int j = 0; j < arr.size(); j++) { String s = arr[j]; jstring jStr = env->NewStringUTF(s.utf8().get_data()); - env->SetObjectArrayElement(a,j,jStr); + env->SetObjectArrayElement(a, j, jStr); to_free.push_back(jStr); } - argv[i].l=a; + argv[i].l = a; to_free.push_back(a); } break; - case ARG_ARRAY_BIT|ARG_TYPE_CLASS: { + case ARG_ARRAY_BIT | ARG_TYPE_CLASS: { - argv[i].l=NULL; + argv[i].l = NULL; } break; } } - r_error.error=Variant::CallError::CALL_OK; - bool success=true; - - switch(method->return_type) { + r_error.error = Variant::CallError::CALL_OK; + bool success = true; + switch (method->return_type) { case ARG_TYPE_VOID: { if (method->_static) { - env->CallStaticVoidMethodA(_class,method->method,argv); + env->CallStaticVoidMethodA(_class, method->method, argv); } else { - env->CallVoidMethodA(p_instance->instance,method->method,argv); + env->CallVoidMethodA(p_instance->instance, method->method, argv); } - ret=Variant(); + ret = Variant(); } break; case ARG_TYPE_BOOLEAN: { if (method->_static) { - ret=env->CallStaticBooleanMethodA(_class,method->method,argv); + ret = env->CallStaticBooleanMethodA(_class, method->method, argv); } else { - ret=env->CallBooleanMethodA(p_instance->instance,method->method,argv); + ret = env->CallBooleanMethodA(p_instance->instance, method->method, argv); } } break; case ARG_TYPE_BYTE: { if (method->_static) { - ret=env->CallStaticByteMethodA(_class,method->method,argv); + ret = env->CallStaticByteMethodA(_class, method->method, argv); } else { - ret=env->CallByteMethodA(p_instance->instance,method->method,argv); + ret = env->CallByteMethodA(p_instance->instance, method->method, argv); } } break; case ARG_TYPE_CHAR: { if (method->_static) { - ret=env->CallStaticCharMethodA(_class,method->method,argv); + ret = env->CallStaticCharMethodA(_class, method->method, argv); } else { - ret=env->CallCharMethodA(p_instance->instance,method->method,argv); + ret = env->CallCharMethodA(p_instance->instance, method->method, argv); } } break; case ARG_TYPE_SHORT: { if (method->_static) { - ret=env->CallStaticShortMethodA(_class,method->method,argv); + ret = env->CallStaticShortMethodA(_class, method->method, argv); } else { - ret=env->CallShortMethodA(p_instance->instance,method->method,argv); + ret = env->CallShortMethodA(p_instance->instance, method->method, argv); } } break; case ARG_TYPE_INT: { if (method->_static) { - ret=env->CallStaticIntMethodA(_class,method->method,argv); + ret = env->CallStaticIntMethodA(_class, method->method, argv); } else { - ret=env->CallIntMethodA(p_instance->instance,method->method,argv); + ret = env->CallIntMethodA(p_instance->instance, method->method, argv); } } break; case ARG_TYPE_LONG: { if (method->_static) { - ret=env->CallStaticLongMethodA(_class,method->method,argv); + ret = env->CallStaticLongMethodA(_class, method->method, argv); } else { - ret=env->CallLongMethodA(p_instance->instance,method->method,argv); + ret = env->CallLongMethodA(p_instance->instance, method->method, argv); } } break; case ARG_TYPE_FLOAT: { if (method->_static) { - ret=env->CallStaticFloatMethodA(_class,method->method,argv); + ret = env->CallStaticFloatMethodA(_class, method->method, argv); } else { - ret=env->CallFloatMethodA(p_instance->instance,method->method,argv); + ret = env->CallFloatMethodA(p_instance->instance, method->method, argv); } } break; case ARG_TYPE_DOUBLE: { if (method->_static) { - ret=env->CallStaticDoubleMethodA(_class,method->method,argv); + ret = env->CallStaticDoubleMethodA(_class, method->method, argv); } else { - ret=env->CallDoubleMethodA(p_instance->instance,method->method,argv); + ret = env->CallDoubleMethodA(p_instance->instance, method->method, argv); } } break; @@ -499,375 +487,366 @@ bool JavaClass::_call_method(JavaObject* p_instance,const StringName& p_method,c jobject obj; if (method->_static) { - obj=env->CallStaticObjectMethodA(_class,method->method,argv); + obj = env->CallStaticObjectMethodA(_class, method->method, argv); } else { - obj=env->CallObjectMethodA(p_instance->instance,method->method,argv); + obj = env->CallObjectMethodA(p_instance->instance, method->method, argv); } if (!obj) { - ret=Variant(); + ret = Variant(); } else { - if (!_convert_object_to_variant(env, obj, ret,method->return_type)) { - ret=Variant(); - r_error.error=Variant::CallError::CALL_ERROR_INVALID_METHOD; - success=false; + if (!_convert_object_to_variant(env, obj, ret, method->return_type)) { + ret = Variant(); + r_error.error = Variant::CallError::CALL_ERROR_INVALID_METHOD; + success = false; } env->DeleteLocalRef(obj); } } break; - } - for(List<jobject>::Element *E=to_free.front();E;E=E->next()) { + for (List<jobject>::Element *E = to_free.front(); E; E = E->next()) { env->DeleteLocalRef(E->get()); } return success; } -Variant JavaClass::call(const StringName& p_method,const Variant** p_args,int p_argcount,Variant::CallError &r_error) { +Variant JavaClass::call(const StringName &p_method, const Variant **p_args, int p_argcount, Variant::CallError &r_error) { Variant ret; - bool found = _call_method(NULL,p_method,p_args,p_argcount,r_error,ret); + bool found = _call_method(NULL, p_method, p_args, p_argcount, r_error, ret); if (found) { return ret; } - return Reference::call(p_method,p_args,p_argcount,r_error); + return Reference::call(p_method, p_args, p_argcount, r_error); } JavaClass::JavaClass() { - } ///////////////////// -Variant JavaObject::call(const StringName& p_method,const Variant** p_args,int p_argcount,Variant::CallError &r_error){ +Variant JavaObject::call(const StringName &p_method, const Variant **p_args, int p_argcount, Variant::CallError &r_error) { return Variant(); } -JavaObject::JavaObject(const Ref<JavaClass>& p_base,jobject *p_instance) { - +JavaObject::JavaObject(const Ref<JavaClass> &p_base, jobject *p_instance) { } -JavaObject::~JavaObject(){ - +JavaObject::~JavaObject() { } - //////////////////// void JavaClassWrapper::_bind_methods() { - ObjectTypeDB::bind_method(_MD("wrap:JavaClass","name"),&JavaClassWrapper::wrap); + ObjectTypeDB::bind_method(_MD("wrap:JavaClass", "name"), &JavaClassWrapper::wrap); } - -bool JavaClassWrapper::_get_type_sig(JNIEnv *env,jobject obj,uint32_t& sig,String&strsig) { +bool JavaClassWrapper::_get_type_sig(JNIEnv *env, jobject obj, uint32_t &sig, String &strsig) { jstring name2 = (jstring)env->CallObjectMethod(obj, Class_getName); - String str_type = env->GetStringUTFChars( name2, NULL ); - print_line("name: "+str_type); + String str_type = env->GetStringUTFChars(name2, NULL); + print_line("name: " + str_type); env->DeleteLocalRef(name2); - uint32_t t=0; + uint32_t t = 0; if (str_type.begins_with("[")) { - t=JavaClass::ARG_ARRAY_BIT; - strsig="["; - str_type=str_type.substr(1,str_type.length()-1); + t = JavaClass::ARG_ARRAY_BIT; + strsig = "["; + str_type = str_type.substr(1, str_type.length() - 1); if (str_type.begins_with("[")) { - print_line("Nested arrays not supported for type: "+str_type); + print_line("Nested arrays not supported for type: " + str_type); return false; } if (str_type.begins_with("L")) { - str_type=str_type.substr(1,str_type.length()-2); //ok it's a class + str_type = str_type.substr(1, str_type.length() - 2); //ok it's a class } } - if (str_type=="void" || str_type=="V") { - t|=JavaClass::ARG_TYPE_VOID; - strsig+="V"; - } else if (str_type=="boolean" || str_type=="Z") { - t|=JavaClass::ARG_TYPE_BOOLEAN; - strsig+="Z"; - } else if (str_type=="byte" || str_type=="B") { - t|=JavaClass::ARG_TYPE_BYTE; - strsig+="B"; - } else if (str_type=="char" || str_type=="C") { - t|=JavaClass::ARG_TYPE_CHAR; - strsig+="C"; - } else if (str_type=="short" || str_type=="S") { - t|=JavaClass::ARG_TYPE_SHORT; - strsig+="S"; - } else if (str_type=="int" || str_type=="I") { - t|=JavaClass::ARG_TYPE_INT; - strsig+="I"; - } else if (str_type=="long" || str_type=="J") { - t|=JavaClass::ARG_TYPE_LONG; - strsig+="J"; - } else if (str_type=="float" || str_type=="F") { - t|=JavaClass::ARG_TYPE_FLOAT; - strsig+="F"; - } else if (str_type=="double" || str_type=="D") { - t|=JavaClass::ARG_TYPE_DOUBLE; - strsig+="D"; - } else if (str_type=="java.lang.String") { - t|=JavaClass::ARG_TYPE_STRING; - strsig+="Ljava/lang/String;"; - } else if (str_type=="java.lang.Boolean") { - t|=JavaClass::ARG_TYPE_BOOLEAN|JavaClass::ARG_NUMBER_CLASS_BIT; - strsig+="Ljava/lang/Boolean;"; - } else if (str_type=="java.lang.Byte") { - t|=JavaClass::ARG_TYPE_BYTE|JavaClass::ARG_NUMBER_CLASS_BIT; - strsig+="Ljava/lang/Byte;"; - } else if (str_type=="java.lang.Character") { - t|=JavaClass::ARG_TYPE_CHAR|JavaClass::ARG_NUMBER_CLASS_BIT; - strsig+="Ljava/lang/Character;"; - } else if (str_type=="java.lang.Short") { - t|=JavaClass::ARG_TYPE_SHORT|JavaClass::ARG_NUMBER_CLASS_BIT; - strsig+="Ljava/lang/Short;"; - } else if (str_type=="java.lang.Integer") { - t|=JavaClass::ARG_TYPE_INT|JavaClass::ARG_NUMBER_CLASS_BIT; - strsig+="Ljava/lang/Integer;"; - } else if (str_type=="java.lang.Long") { - t|=JavaClass::ARG_TYPE_LONG|JavaClass::ARG_NUMBER_CLASS_BIT; - strsig+="Ljava/lang/Long;"; - } else if (str_type=="java.lang.Float") { - t|=JavaClass::ARG_TYPE_FLOAT|JavaClass::ARG_NUMBER_CLASS_BIT; - strsig+="Ljava/lang/Float;"; - } else if (str_type=="java.lang.Double") { - t|=JavaClass::ARG_TYPE_DOUBLE|JavaClass::ARG_NUMBER_CLASS_BIT; - strsig+="Ljava/lang/Double;"; + if (str_type == "void" || str_type == "V") { + t |= JavaClass::ARG_TYPE_VOID; + strsig += "V"; + } else if (str_type == "boolean" || str_type == "Z") { + t |= JavaClass::ARG_TYPE_BOOLEAN; + strsig += "Z"; + } else if (str_type == "byte" || str_type == "B") { + t |= JavaClass::ARG_TYPE_BYTE; + strsig += "B"; + } else if (str_type == "char" || str_type == "C") { + t |= JavaClass::ARG_TYPE_CHAR; + strsig += "C"; + } else if (str_type == "short" || str_type == "S") { + t |= JavaClass::ARG_TYPE_SHORT; + strsig += "S"; + } else if (str_type == "int" || str_type == "I") { + t |= JavaClass::ARG_TYPE_INT; + strsig += "I"; + } else if (str_type == "long" || str_type == "J") { + t |= JavaClass::ARG_TYPE_LONG; + strsig += "J"; + } else if (str_type == "float" || str_type == "F") { + t |= JavaClass::ARG_TYPE_FLOAT; + strsig += "F"; + } else if (str_type == "double" || str_type == "D") { + t |= JavaClass::ARG_TYPE_DOUBLE; + strsig += "D"; + } else if (str_type == "java.lang.String") { + t |= JavaClass::ARG_TYPE_STRING; + strsig += "Ljava/lang/String;"; + } else if (str_type == "java.lang.Boolean") { + t |= JavaClass::ARG_TYPE_BOOLEAN | JavaClass::ARG_NUMBER_CLASS_BIT; + strsig += "Ljava/lang/Boolean;"; + } else if (str_type == "java.lang.Byte") { + t |= JavaClass::ARG_TYPE_BYTE | JavaClass::ARG_NUMBER_CLASS_BIT; + strsig += "Ljava/lang/Byte;"; + } else if (str_type == "java.lang.Character") { + t |= JavaClass::ARG_TYPE_CHAR | JavaClass::ARG_NUMBER_CLASS_BIT; + strsig += "Ljava/lang/Character;"; + } else if (str_type == "java.lang.Short") { + t |= JavaClass::ARG_TYPE_SHORT | JavaClass::ARG_NUMBER_CLASS_BIT; + strsig += "Ljava/lang/Short;"; + } else if (str_type == "java.lang.Integer") { + t |= JavaClass::ARG_TYPE_INT | JavaClass::ARG_NUMBER_CLASS_BIT; + strsig += "Ljava/lang/Integer;"; + } else if (str_type == "java.lang.Long") { + t |= JavaClass::ARG_TYPE_LONG | JavaClass::ARG_NUMBER_CLASS_BIT; + strsig += "Ljava/lang/Long;"; + } else if (str_type == "java.lang.Float") { + t |= JavaClass::ARG_TYPE_FLOAT | JavaClass::ARG_NUMBER_CLASS_BIT; + strsig += "Ljava/lang/Float;"; + } else if (str_type == "java.lang.Double") { + t |= JavaClass::ARG_TYPE_DOUBLE | JavaClass::ARG_NUMBER_CLASS_BIT; + strsig += "Ljava/lang/Double;"; } else { //a class likely - strsig+="L"+str_type.replace(".","/")+";"; - t|=JavaClass::ARG_TYPE_CLASS; + strsig += "L" + str_type.replace(".", "/") + ";"; + t |= JavaClass::ARG_TYPE_CLASS; } - sig=t; - + sig = t; return true; - } -bool JavaClass::_convert_object_to_variant(JNIEnv * env, jobject obj, Variant& var,uint32_t p_sig) { +bool JavaClass::_convert_object_to_variant(JNIEnv *env, jobject obj, Variant &var, uint32_t p_sig) { if (!obj) { - var=Variant(); //seems null is just null... + var = Variant(); //seems null is just null... return true; } - - switch(p_sig) { + switch (p_sig) { case ARG_TYPE_VOID: { return Variant(); } break; - case ARG_TYPE_BOOLEAN|ARG_NUMBER_CLASS_BIT: { + case ARG_TYPE_BOOLEAN | ARG_NUMBER_CLASS_BIT: { var = env->CallBooleanMethod(obj, JavaClassWrapper::singleton->Boolean_booleanValue); return true; } break; - case ARG_TYPE_BYTE|ARG_NUMBER_CLASS_BIT: { + case ARG_TYPE_BYTE | ARG_NUMBER_CLASS_BIT: { var = env->CallByteMethod(obj, JavaClassWrapper::singleton->Byte_byteValue); return true; } break; - case ARG_TYPE_CHAR|ARG_NUMBER_CLASS_BIT: { + case ARG_TYPE_CHAR | ARG_NUMBER_CLASS_BIT: { var = env->CallCharMethod(obj, JavaClassWrapper::singleton->Character_characterValue); return true; } break; - case ARG_TYPE_SHORT|ARG_NUMBER_CLASS_BIT: { + case ARG_TYPE_SHORT | ARG_NUMBER_CLASS_BIT: { var = env->CallShortMethod(obj, JavaClassWrapper::singleton->Short_shortValue); return true; } break; - case ARG_TYPE_INT|ARG_NUMBER_CLASS_BIT: { + case ARG_TYPE_INT | ARG_NUMBER_CLASS_BIT: { var = env->CallIntMethod(obj, JavaClassWrapper::singleton->Integer_integerValue); return true; } break; - case ARG_TYPE_LONG|ARG_NUMBER_CLASS_BIT: { + case ARG_TYPE_LONG | ARG_NUMBER_CLASS_BIT: { var = env->CallLongMethod(obj, JavaClassWrapper::singleton->Long_longValue); return true; } break; - case ARG_TYPE_FLOAT|ARG_NUMBER_CLASS_BIT: { + case ARG_TYPE_FLOAT | ARG_NUMBER_CLASS_BIT: { var = env->CallFloatMethod(obj, JavaClassWrapper::singleton->Float_floatValue); return true; } break; - case ARG_TYPE_DOUBLE|ARG_NUMBER_CLASS_BIT: { + case ARG_TYPE_DOUBLE | ARG_NUMBER_CLASS_BIT: { var = env->CallDoubleMethod(obj, JavaClassWrapper::singleton->Double_doubleValue); return true; } break; case ARG_TYPE_STRING: { - var = String::utf8(env->GetStringUTFChars( (jstring)obj, NULL )); + var = String::utf8(env->GetStringUTFChars((jstring)obj, NULL)); return true; } break; case ARG_TYPE_CLASS: { return false; } break; - case ARG_ARRAY_BIT|ARG_TYPE_VOID: { + case ARG_ARRAY_BIT | ARG_TYPE_VOID: { var = Array(); // ? return true; } break; - case ARG_ARRAY_BIT|ARG_TYPE_BOOLEAN: { + case ARG_ARRAY_BIT | ARG_TYPE_BOOLEAN: { Array ret; jobjectArray arr = (jobjectArray)obj; int count = env->GetArrayLength(arr); - for (int i=0; i<count; i++) { + for (int i = 0; i < count; i++) { jboolean val; - env->GetBooleanArrayRegion((jbooleanArray)arr,0,1,&val); + env->GetBooleanArrayRegion((jbooleanArray)arr, 0, 1, &val); ret.push_back(val); } - var=ret; + var = ret; return true; } break; - case ARG_ARRAY_BIT|ARG_TYPE_BYTE: { + case ARG_ARRAY_BIT | ARG_TYPE_BYTE: { Array ret; jobjectArray arr = (jobjectArray)obj; int count = env->GetArrayLength(arr); - for (int i=0; i<count; i++) { + for (int i = 0; i < count; i++) { jbyte val; - env->GetByteArrayRegion((jbyteArray)arr,0,1,&val); + env->GetByteArrayRegion((jbyteArray)arr, 0, 1, &val); ret.push_back(val); } - var=ret; + var = ret; return true; } break; - case ARG_ARRAY_BIT|ARG_TYPE_CHAR: { + case ARG_ARRAY_BIT | ARG_TYPE_CHAR: { Array ret; jobjectArray arr = (jobjectArray)obj; int count = env->GetArrayLength(arr); - for (int i=0; i<count; i++) { + for (int i = 0; i < count; i++) { jchar val; - env->GetCharArrayRegion((jcharArray)arr,0,1,&val); + env->GetCharArrayRegion((jcharArray)arr, 0, 1, &val); ret.push_back(val); } - var=ret; + var = ret; return true; } break; - case ARG_ARRAY_BIT|ARG_TYPE_SHORT: { + case ARG_ARRAY_BIT | ARG_TYPE_SHORT: { Array ret; jobjectArray arr = (jobjectArray)obj; int count = env->GetArrayLength(arr); - for (int i=0; i<count; i++) { + for (int i = 0; i < count; i++) { jshort val; - env->GetShortArrayRegion((jshortArray)arr,0,1,&val); + env->GetShortArrayRegion((jshortArray)arr, 0, 1, &val); ret.push_back(val); } - var=ret; + var = ret; return true; } break; - case ARG_ARRAY_BIT|ARG_TYPE_INT: { + case ARG_ARRAY_BIT | ARG_TYPE_INT: { Array ret; jobjectArray arr = (jobjectArray)obj; int count = env->GetArrayLength(arr); - for (int i=0; i<count; i++) { + for (int i = 0; i < count; i++) { jint val; - env->GetIntArrayRegion((jintArray)arr,0,1,&val); + env->GetIntArrayRegion((jintArray)arr, 0, 1, &val); ret.push_back(val); } - var=ret; + var = ret; return true; } break; - case ARG_ARRAY_BIT|ARG_TYPE_LONG: { + case ARG_ARRAY_BIT | ARG_TYPE_LONG: { Array ret; jobjectArray arr = (jobjectArray)obj; int count = env->GetArrayLength(arr); - for (int i=0; i<count; i++) { + for (int i = 0; i < count; i++) { jlong val; - env->GetLongArrayRegion((jlongArray)arr,0,1,&val); + env->GetLongArrayRegion((jlongArray)arr, 0, 1, &val); ret.push_back(val); } - var=ret; + var = ret; return true; } break; - case ARG_ARRAY_BIT|ARG_TYPE_FLOAT: { + case ARG_ARRAY_BIT | ARG_TYPE_FLOAT: { Array ret; jobjectArray arr = (jobjectArray)obj; int count = env->GetArrayLength(arr); - for (int i=0; i<count; i++) { + for (int i = 0; i < count; i++) { jfloat val; - env->GetFloatArrayRegion((jfloatArray)arr,0,1,&val); + env->GetFloatArrayRegion((jfloatArray)arr, 0, 1, &val); ret.push_back(val); } - var=ret; + var = ret; return true; } break; - case ARG_ARRAY_BIT|ARG_TYPE_DOUBLE: { + case ARG_ARRAY_BIT | ARG_TYPE_DOUBLE: { Array ret; jobjectArray arr = (jobjectArray)obj; int count = env->GetArrayLength(arr); - for (int i=0; i<count; i++) { + for (int i = 0; i < count; i++) { jdouble val; - env->GetDoubleArrayRegion((jdoubleArray)arr,0,1,&val); + env->GetDoubleArrayRegion((jdoubleArray)arr, 0, 1, &val); ret.push_back(val); } - var=ret; + var = ret; return true; } break; - case ARG_NUMBER_CLASS_BIT|ARG_ARRAY_BIT|ARG_TYPE_BOOLEAN: { + case ARG_NUMBER_CLASS_BIT | ARG_ARRAY_BIT | ARG_TYPE_BOOLEAN: { Array ret; jobjectArray arr = (jobjectArray)obj; int count = env->GetArrayLength(arr); - for (int i=0; i<count; i++) { + for (int i = 0; i < count; i++) { jobject o = env->GetObjectArrayElement(arr, i); if (!o) @@ -875,23 +854,22 @@ bool JavaClass::_convert_object_to_variant(JNIEnv * env, jobject obj, Variant& v else { bool val = env->CallBooleanMethod(o, JavaClassWrapper::singleton->Boolean_booleanValue); ret.push_back(val); - } env->DeleteLocalRef(o); } - var=ret; + var = ret; return true; } break; - case ARG_NUMBER_CLASS_BIT|ARG_ARRAY_BIT|ARG_TYPE_BYTE: { + case ARG_NUMBER_CLASS_BIT | ARG_ARRAY_BIT | ARG_TYPE_BYTE: { Array ret; jobjectArray arr = (jobjectArray)obj; int count = env->GetArrayLength(arr); - for (int i=0; i<count; i++) { + for (int i = 0; i < count; i++) { jobject o = env->GetObjectArrayElement(arr, i); if (!o) @@ -899,22 +877,21 @@ bool JavaClass::_convert_object_to_variant(JNIEnv * env, jobject obj, Variant& v else { int val = env->CallByteMethod(o, JavaClassWrapper::singleton->Byte_byteValue); ret.push_back(val); - } env->DeleteLocalRef(o); } - var=ret; + var = ret; return true; } break; - case ARG_NUMBER_CLASS_BIT|ARG_ARRAY_BIT|ARG_TYPE_CHAR: { + case ARG_NUMBER_CLASS_BIT | ARG_ARRAY_BIT | ARG_TYPE_CHAR: { Array ret; jobjectArray arr = (jobjectArray)obj; int count = env->GetArrayLength(arr); - for (int i=0; i<count; i++) { + for (int i = 0; i < count; i++) { jobject o = env->GetObjectArrayElement(arr, i); if (!o) @@ -922,22 +899,21 @@ bool JavaClass::_convert_object_to_variant(JNIEnv * env, jobject obj, Variant& v else { int val = env->CallCharMethod(o, JavaClassWrapper::singleton->Character_characterValue); ret.push_back(val); - } env->DeleteLocalRef(o); } - var=ret; + var = ret; return true; } break; - case ARG_NUMBER_CLASS_BIT|ARG_ARRAY_BIT|ARG_TYPE_SHORT: { + case ARG_NUMBER_CLASS_BIT | ARG_ARRAY_BIT | ARG_TYPE_SHORT: { Array ret; jobjectArray arr = (jobjectArray)obj; int count = env->GetArrayLength(arr); - for (int i=0; i<count; i++) { + for (int i = 0; i < count; i++) { jobject o = env->GetObjectArrayElement(arr, i); if (!o) @@ -945,22 +921,21 @@ bool JavaClass::_convert_object_to_variant(JNIEnv * env, jobject obj, Variant& v else { int val = env->CallShortMethod(o, JavaClassWrapper::singleton->Short_shortValue); ret.push_back(val); - } env->DeleteLocalRef(o); } - var=ret; + var = ret; return true; } break; - case ARG_NUMBER_CLASS_BIT|ARG_ARRAY_BIT|ARG_TYPE_INT: { + case ARG_NUMBER_CLASS_BIT | ARG_ARRAY_BIT | ARG_TYPE_INT: { Array ret; jobjectArray arr = (jobjectArray)obj; int count = env->GetArrayLength(arr); - for (int i=0; i<count; i++) { + for (int i = 0; i < count; i++) { jobject o = env->GetObjectArrayElement(arr, i); if (!o) @@ -968,22 +943,21 @@ bool JavaClass::_convert_object_to_variant(JNIEnv * env, jobject obj, Variant& v else { int val = env->CallIntMethod(o, JavaClassWrapper::singleton->Integer_integerValue); ret.push_back(val); - } env->DeleteLocalRef(o); } - var=ret; + var = ret; return true; } break; - case ARG_NUMBER_CLASS_BIT|ARG_ARRAY_BIT|ARG_TYPE_LONG: { + case ARG_NUMBER_CLASS_BIT | ARG_ARRAY_BIT | ARG_TYPE_LONG: { Array ret; jobjectArray arr = (jobjectArray)obj; int count = env->GetArrayLength(arr); - for (int i=0; i<count; i++) { + for (int i = 0; i < count; i++) { jobject o = env->GetObjectArrayElement(arr, i); if (!o) @@ -991,22 +965,21 @@ bool JavaClass::_convert_object_to_variant(JNIEnv * env, jobject obj, Variant& v else { int64_t val = env->CallLongMethod(o, JavaClassWrapper::singleton->Long_longValue); ret.push_back(val); - } env->DeleteLocalRef(o); } - var=ret; + var = ret; return true; } break; - case ARG_NUMBER_CLASS_BIT|ARG_ARRAY_BIT|ARG_TYPE_FLOAT: { + case ARG_NUMBER_CLASS_BIT | ARG_ARRAY_BIT | ARG_TYPE_FLOAT: { Array ret; jobjectArray arr = (jobjectArray)obj; int count = env->GetArrayLength(arr); - for (int i=0; i<count; i++) { + for (int i = 0; i < count; i++) { jobject o = env->GetObjectArrayElement(arr, i); if (!o) @@ -1014,21 +987,20 @@ bool JavaClass::_convert_object_to_variant(JNIEnv * env, jobject obj, Variant& v else { float val = env->CallFloatMethod(o, JavaClassWrapper::singleton->Float_floatValue); ret.push_back(val); - } env->DeleteLocalRef(o); } - var=ret; + var = ret; return true; } break; - case ARG_NUMBER_CLASS_BIT|ARG_ARRAY_BIT|ARG_TYPE_DOUBLE: { + case ARG_NUMBER_CLASS_BIT | ARG_ARRAY_BIT | ARG_TYPE_DOUBLE: { Array ret; jobjectArray arr = (jobjectArray)obj; int count = env->GetArrayLength(arr); - for (int i=0; i<count; i++) { + for (int i = 0; i < count; i++) { jobject o = env->GetObjectArrayElement(arr, i); if (!o) @@ -1036,58 +1008,53 @@ bool JavaClass::_convert_object_to_variant(JNIEnv * env, jobject obj, Variant& v else { double val = env->CallDoubleMethod(o, JavaClassWrapper::singleton->Double_doubleValue); ret.push_back(val); - } env->DeleteLocalRef(o); } - var=ret; + var = ret; return true; } break; - case ARG_ARRAY_BIT|ARG_TYPE_STRING: { + case ARG_ARRAY_BIT | ARG_TYPE_STRING: { Array ret; jobjectArray arr = (jobjectArray)obj; int count = env->GetArrayLength(arr); - for (int i=0; i<count; i++) { + for (int i = 0; i < count; i++) { jobject o = env->GetObjectArrayElement(arr, i); if (!o) ret.push_back(Variant()); else { - String val = String::utf8(env->GetStringUTFChars( (jstring)o, NULL )); + String val = String::utf8(env->GetStringUTFChars((jstring)o, NULL)); ret.push_back(val); - } env->DeleteLocalRef(o); } - var=ret; + var = ret; return true; } break; - case ARG_ARRAY_BIT|ARG_TYPE_CLASS: { + case ARG_ARRAY_BIT | ARG_TYPE_CLASS: { } break; } return false; - } - -Ref<JavaClass> JavaClassWrapper::wrap(const String& p_class) { +Ref<JavaClass> JavaClassWrapper::wrap(const String &p_class) { if (class_cache.has(p_class)) return class_cache[p_class]; - JNIEnv *env = ThreadAndroid::get_env(); jclass bclass = env->FindClass(p_class.utf8().get_data()); - ERR_FAIL_COND_V(!bclass,Ref<JavaClass>()); + ERR_FAIL_COND_V(!bclass, Ref<JavaClass>()); //jmethodID getDeclaredMethods = env->GetMethodID(bclass,"getDeclaredMethods", "()[Ljava/lang/reflect/Method;"); @@ -1095,130 +1062,121 @@ Ref<JavaClass> JavaClassWrapper::wrap(const String& p_class) { jobjectArray methods = (jobjectArray)env->CallObjectMethod(bclass, getDeclaredMethods); - ERR_FAIL_COND_V(!methods,Ref<JavaClass>()); + ERR_FAIL_COND_V(!methods, Ref<JavaClass>()); - - Ref<JavaClass> java_class = memnew( JavaClass ); + Ref<JavaClass> java_class = memnew(JavaClass); int count = env->GetArrayLength(methods); - for (int i=0; i<count; i++) { + for (int i = 0; i < count; i++) { jobject obj = env->GetObjectArrayElement(methods, i); ERR_CONTINUE(!obj); - jstring name = (jstring)env->CallObjectMethod(obj, getName); - String str_method = env->GetStringUTFChars( name, NULL ); + String str_method = env->GetStringUTFChars(name, NULL); env->DeleteLocalRef(name); Vector<String> params; - jint mods = env->CallIntMethod(obj,getModifiers); + jint mods = env->CallIntMethod(obj, getModifiers); - if (!(mods&0x0001)) { + if (!(mods & 0x0001)) { env->DeleteLocalRef(obj); continue; //not public bye } - - jobjectArray param_types = (jobjectArray)env->CallObjectMethod(obj, getParameterTypes); - int count2=env->GetArrayLength(param_types); + int count2 = env->GetArrayLength(param_types); if (!java_class->methods.has(str_method)) { - java_class->methods[str_method]=List<JavaClass::MethodInfo>(); + java_class->methods[str_method] = List<JavaClass::MethodInfo>(); } JavaClass::MethodInfo mi; - mi._static = (mods&0x8)!=0; - bool valid=true; - String signature="("; + mi._static = (mods & 0x8) != 0; + bool valid = true; + String signature = "("; - for(int j=0;j<count2;j++) { + for (int j = 0; j < count2; j++) { jobject obj2 = env->GetObjectArrayElement(param_types, j); String strsig; - uint32_t sig=0; - if (!_get_type_sig(env,obj2,sig,strsig)) { - valid=false; + uint32_t sig = 0; + if (!_get_type_sig(env, obj2, sig, strsig)) { + valid = false; env->DeleteLocalRef(obj2); break; } - signature+=strsig; + signature += strsig; mi.param_types.push_back(sig); mi.param_sigs.push_back(strsig); env->DeleteLocalRef(obj2); - } if (!valid) { - print_line("Method Can't be bound (unsupported arguments): "+p_class+"::"+str_method); + print_line("Method Can't be bound (unsupported arguments): " + p_class + "::" + str_method); env->DeleteLocalRef(obj); env->DeleteLocalRef(param_types); continue; } - signature+=")"; + signature += ")"; jobject return_type = (jobject)env->CallObjectMethod(obj, getReturnType); - String strsig; - uint32_t sig=0; - if (!_get_type_sig(env,return_type,sig,strsig)) { - print_line("Method Can't be bound (unsupported return type): "+p_class+"::"+str_method); + uint32_t sig = 0; + if (!_get_type_sig(env, return_type, sig, strsig)) { + print_line("Method Can't be bound (unsupported return type): " + p_class + "::" + str_method); env->DeleteLocalRef(obj); env->DeleteLocalRef(param_types); env->DeleteLocalRef(return_type); continue; } - signature+=strsig; - mi.return_type=sig; + signature += strsig; + mi.return_type = sig; - print_line("METHOD: "+str_method+" SIG: "+signature+" static: "+itos(mi._static)); + print_line("METHOD: " + str_method + " SIG: " + signature + " static: " + itos(mi._static)); - bool discard=false; + bool discard = false; - for(List<JavaClass::MethodInfo>::Element *E=java_class->methods[str_method].front();E;E=E->next()) { + for (List<JavaClass::MethodInfo>::Element *E = java_class->methods[str_method].front(); E; E = E->next()) { - float new_likeliness=0; - float existing_likeliness=0; + float new_likeliness = 0; + float existing_likeliness = 0; - if (E->get().param_types.size()!=mi.param_types.size()) + if (E->get().param_types.size() != mi.param_types.size()) continue; - bool valid=true; - for(int j=0;j<E->get().param_types.size();j++) { + bool valid = true; + for (int j = 0; j < E->get().param_types.size(); j++) { Variant::Type _new; float new_l; Variant::Type existing; float existing_l; - JavaClass::_convert_to_variant_type(E->get().param_types[j],existing,existing_l); - JavaClass::_convert_to_variant_type(mi.param_types[j],_new,new_l); - if (_new!=existing) { - valid=false; + JavaClass::_convert_to_variant_type(E->get().param_types[j], existing, existing_l); + JavaClass::_convert_to_variant_type(mi.param_types[j], _new, new_l); + if (_new != existing) { + valid = false; break; } - new_likeliness+=new_l; - existing_likeliness=existing_l; - + new_likeliness += new_l; + existing_likeliness = existing_l; } if (!valid) continue; - if (new_likeliness>existing_likeliness) { + if (new_likeliness > existing_likeliness) { java_class->methods[str_method].erase(E); print_line("replace old"); break; } else { - discard=true; + discard = true; print_line("old is better"); } - - } if (!discard) { @@ -1236,12 +1194,8 @@ Ref<JavaClass> JavaClassWrapper::wrap(const String& p_class) { env->DeleteLocalRef(param_types); env->DeleteLocalRef(return_type); - - - //args[i] = _jobject_to_variant(env, obj); -// print_line("\targ"+itos(i)+": "+Variant::get_type_name(args[i].get_type())); - + // print_line("\targ"+itos(i)+": "+Variant::get_type_name(args[i].get_type())); }; env->DeleteLocalRef(methods); @@ -1250,33 +1204,32 @@ Ref<JavaClass> JavaClassWrapper::wrap(const String& p_class) { count = env->GetArrayLength(fields); - for (int i=0; i<count; i++) { + for (int i = 0; i < count; i++) { jobject obj = env->GetObjectArrayElement(fields, i); ERR_CONTINUE(!obj); jstring name = (jstring)env->CallObjectMethod(obj, Field_getName); - String str_field = env->GetStringUTFChars( name, NULL ); + String str_field = env->GetStringUTFChars(name, NULL); env->DeleteLocalRef(name); - print_line("FIELD: "+str_field); - int mods = env->CallIntMethod(obj,Field_getModifiers); - if ((mods&0x8) && (mods&0x10) && (mods&0x1)) { //static final public! + print_line("FIELD: " + str_field); + int mods = env->CallIntMethod(obj, Field_getModifiers); + if ((mods & 0x8) && (mods & 0x10) && (mods & 0x1)) { //static final public! - jobject objc = env->CallObjectMethod(obj, Field_get,NULL); + jobject objc = env->CallObjectMethod(obj, Field_get, NULL); if (objc) { - uint32_t sig; String strsig; jclass cl = env->GetObjectClass(objc); - if (JavaClassWrapper::_get_type_sig(env,cl,sig,strsig)) { + if (JavaClassWrapper::_get_type_sig(env, cl, sig, strsig)) { - if ((sig&JavaClass::ARG_TYPE_MASK)<=JavaClass::ARG_TYPE_STRING) { + if ((sig & JavaClass::ARG_TYPE_MASK) <= JavaClass::ARG_TYPE_STRING) { Variant value; - if (JavaClass::_convert_object_to_variant(env,objc,value,sig)) { + if (JavaClass::_convert_object_to_variant(env, objc, value, sig)) { - java_class->constant_map[str_field]=value; + java_class->constant_map[str_field] = value; } } } @@ -1284,49 +1237,46 @@ Ref<JavaClass> JavaClassWrapper::wrap(const String& p_class) { env->DeleteLocalRef(cl); } - env->DeleteLocalRef(objc); - } env->DeleteLocalRef(obj); } env->DeleteLocalRef(fields); - return Ref<JavaClass>(); } -JavaClassWrapper *JavaClassWrapper::singleton=NULL; +JavaClassWrapper *JavaClassWrapper::singleton = NULL; JavaClassWrapper::JavaClassWrapper(jobject p_activity) { - singleton=this; + singleton = this; JNIEnv *env = ThreadAndroid::get_env(); jclass activityClass = env->FindClass("org/godotengine/godot/Godot"); - jmethodID getClassLoader = env->GetMethodID(activityClass,"getClassLoader", "()Ljava/lang/ClassLoader;"); + jmethodID getClassLoader = env->GetMethodID(activityClass, "getClassLoader", "()Ljava/lang/ClassLoader;"); classLoader = env->CallObjectMethod(p_activity, getClassLoader); - classLoader=(jclass)env->NewGlobalRef(classLoader); + classLoader = (jclass)env->NewGlobalRef(classLoader); jclass classLoaderClass = env->FindClass("java/lang/ClassLoader"); findClass = env->GetMethodID(classLoaderClass, "loadClass", "(Ljava/lang/String;)Ljava/lang/Class;"); jclass bclass = env->FindClass("java/lang/Class"); - getDeclaredMethods = env->GetMethodID(bclass,"getDeclaredMethods", "()[Ljava/lang/reflect/Method;"); - getFields = env->GetMethodID(bclass,"getFields", "()[Ljava/lang/reflect/Field;"); - Class_getName = env->GetMethodID(bclass,"getName", "()Ljava/lang/String;"); + getDeclaredMethods = env->GetMethodID(bclass, "getDeclaredMethods", "()[Ljava/lang/reflect/Method;"); + getFields = env->GetMethodID(bclass, "getFields", "()[Ljava/lang/reflect/Field;"); + Class_getName = env->GetMethodID(bclass, "getName", "()Ljava/lang/String;"); // bclass = env->FindClass("java/lang/reflect/Method"); - getParameterTypes = env->GetMethodID(bclass,"getParameterTypes", "()[Ljava/lang/Class;"); - getReturnType = env->GetMethodID(bclass,"getReturnType", "()Ljava/lang/Class;"); - getName = env->GetMethodID(bclass,"getName", "()Ljava/lang/String;"); - getModifiers = env->GetMethodID(bclass,"getModifiers", "()I"); + getParameterTypes = env->GetMethodID(bclass, "getParameterTypes", "()[Ljava/lang/Class;"); + getReturnType = env->GetMethodID(bclass, "getReturnType", "()Ljava/lang/Class;"); + getName = env->GetMethodID(bclass, "getName", "()Ljava/lang/String;"); + getModifiers = env->GetMethodID(bclass, "getModifiers", "()I"); /// bclass = env->FindClass("java/lang/reflect/Field"); - Field_getName = env->GetMethodID(bclass,"getName", "()Ljava/lang/String;"); - Field_getModifiers = env->GetMethodID(bclass,"getModifiers", "()I"); - Field_get = env->GetMethodID(bclass,"get", "(Ljava/lang/Object;)Ljava/lang/Object;"); + Field_getName = env->GetMethodID(bclass, "getName", "()Ljava/lang/String;"); + Field_getModifiers = env->GetMethodID(bclass, "getModifiers", "()I"); + Field_get = env->GetMethodID(bclass, "get", "(Ljava/lang/Object;)Ljava/lang/Object;"); // each bclass = env->FindClass("java/lang/Boolean"); Boolean_booleanValue = env->GetMethodID(bclass, "booleanValue", "()Z"); @@ -1351,5 +1301,4 @@ JavaClassWrapper::JavaClassWrapper(jobject p_activity) { bclass = env->FindClass("java/lang/Double"); Double_doubleValue = env->GetMethodID(bclass, "doubleValue", "()D"); - } diff --git a/platform/android/java_class_wrapper.h b/platform/android/java_class_wrapper.h index 8165d636c..5729d7c31 100644 --- a/platform/android/java_class_wrapper.h +++ b/platform/android/java_class_wrapper.h @@ -30,14 +30,14 @@ #define JAVA_CLASS_WRAPPER_H #include "reference.h" -#include <jni.h> #include <android/log.h> +#include <jni.h> class JavaObject; class JavaClass : public Reference { - OBJ_TYPE(JavaClass,Reference); + OBJ_TYPE(JavaClass, Reference); enum ArgumentType { @@ -52,13 +52,12 @@ class JavaClass : public Reference { ARG_TYPE_DOUBLE, ARG_TYPE_STRING, //special case ARG_TYPE_CLASS, - ARG_ARRAY_BIT=1<<16, - ARG_NUMBER_CLASS_BIT=1<<17, - ARG_TYPE_MASK=(1<<16)-1 + ARG_ARRAY_BIT = 1 << 16, + ARG_NUMBER_CLASS_BIT = 1 << 17, + ARG_TYPE_MASK = (1 << 16) - 1 }; - - Map<StringName,Variant> constant_map; + Map<StringName, Variant> constant_map; struct MethodInfo { @@ -67,94 +66,126 @@ class JavaClass : public Reference { Vector<StringName> param_sigs; uint32_t return_type; jmethodID method; - }; - _FORCE_INLINE_ static void _convert_to_variant_type(int p_sig, Variant::Type& r_type, float& likelyhood) { + _FORCE_INLINE_ static void _convert_to_variant_type(int p_sig, Variant::Type &r_type, float &likelyhood) { - likelyhood=1.0; - r_type=Variant::NIL; + likelyhood = 1.0; + r_type = Variant::NIL; - switch(p_sig) { + switch (p_sig) { - case ARG_TYPE_VOID: r_type=Variant::NIL; break; - case ARG_TYPE_BOOLEAN|ARG_NUMBER_CLASS_BIT: - case ARG_TYPE_BOOLEAN: r_type=Variant::BOOL; break; - case ARG_TYPE_BYTE|ARG_NUMBER_CLASS_BIT: - case ARG_TYPE_BYTE: r_type=Variant::INT; likelyhood=0.1; break; - case ARG_TYPE_CHAR|ARG_NUMBER_CLASS_BIT: - case ARG_TYPE_CHAR: r_type=Variant::INT; likelyhood=0.2; break; - case ARG_TYPE_SHORT|ARG_NUMBER_CLASS_BIT: - case ARG_TYPE_SHORT: r_type=Variant::INT; likelyhood=0.3; break; - case ARG_TYPE_INT|ARG_NUMBER_CLASS_BIT: - case ARG_TYPE_INT: r_type=Variant::INT; likelyhood=1.0; break; - case ARG_TYPE_LONG|ARG_NUMBER_CLASS_BIT: - case ARG_TYPE_LONG: r_type=Variant::INT; likelyhood=0.5; break; - case ARG_TYPE_FLOAT|ARG_NUMBER_CLASS_BIT: - case ARG_TYPE_FLOAT: r_type=Variant::REAL; likelyhood=1.0; break; - case ARG_TYPE_DOUBLE|ARG_NUMBER_CLASS_BIT: - case ARG_TYPE_DOUBLE: r_type=Variant::REAL; likelyhood=0.5; break; - case ARG_TYPE_STRING: r_type=Variant::STRING; break; - case ARG_TYPE_CLASS: r_type=Variant::OBJECT; break; - case ARG_ARRAY_BIT|ARG_TYPE_VOID: r_type=Variant::NIL; break; - case ARG_ARRAY_BIT|ARG_TYPE_BOOLEAN: r_type=Variant::ARRAY; break; - case ARG_ARRAY_BIT|ARG_TYPE_BYTE: r_type=Variant::RAW_ARRAY; likelyhood=1.0; break; - case ARG_ARRAY_BIT|ARG_TYPE_CHAR: r_type=Variant::RAW_ARRAY; likelyhood=0.5; break; - case ARG_ARRAY_BIT|ARG_TYPE_SHORT: r_type=Variant::INT_ARRAY; likelyhood=0.3; break; - case ARG_ARRAY_BIT|ARG_TYPE_INT: r_type=Variant::INT_ARRAY; likelyhood=1.0; break; - case ARG_ARRAY_BIT|ARG_TYPE_LONG: r_type=Variant::INT_ARRAY; likelyhood=0.5; break; - case ARG_ARRAY_BIT|ARG_TYPE_FLOAT: r_type=Variant::REAL_ARRAY; likelyhood=1.0; break; - case ARG_ARRAY_BIT|ARG_TYPE_DOUBLE: r_type=Variant::REAL_ARRAY; likelyhood=0.5; break; - case ARG_ARRAY_BIT|ARG_TYPE_STRING: r_type=Variant::STRING_ARRAY; break; - case ARG_ARRAY_BIT|ARG_TYPE_CLASS: r_type=Variant::ARRAY; break; + case ARG_TYPE_VOID: r_type = Variant::NIL; break; + case ARG_TYPE_BOOLEAN | ARG_NUMBER_CLASS_BIT: + case ARG_TYPE_BOOLEAN: r_type = Variant::BOOL; break; + case ARG_TYPE_BYTE | ARG_NUMBER_CLASS_BIT: + case ARG_TYPE_BYTE: + r_type = Variant::INT; + likelyhood = 0.1; + break; + case ARG_TYPE_CHAR | ARG_NUMBER_CLASS_BIT: + case ARG_TYPE_CHAR: + r_type = Variant::INT; + likelyhood = 0.2; + break; + case ARG_TYPE_SHORT | ARG_NUMBER_CLASS_BIT: + case ARG_TYPE_SHORT: + r_type = Variant::INT; + likelyhood = 0.3; + break; + case ARG_TYPE_INT | ARG_NUMBER_CLASS_BIT: + case ARG_TYPE_INT: + r_type = Variant::INT; + likelyhood = 1.0; + break; + case ARG_TYPE_LONG | ARG_NUMBER_CLASS_BIT: + case ARG_TYPE_LONG: + r_type = Variant::INT; + likelyhood = 0.5; + break; + case ARG_TYPE_FLOAT | ARG_NUMBER_CLASS_BIT: + case ARG_TYPE_FLOAT: + r_type = Variant::REAL; + likelyhood = 1.0; + break; + case ARG_TYPE_DOUBLE | ARG_NUMBER_CLASS_BIT: + case ARG_TYPE_DOUBLE: + r_type = Variant::REAL; + likelyhood = 0.5; + break; + case ARG_TYPE_STRING: r_type = Variant::STRING; break; + case ARG_TYPE_CLASS: r_type = Variant::OBJECT; break; + case ARG_ARRAY_BIT | ARG_TYPE_VOID: r_type = Variant::NIL; break; + case ARG_ARRAY_BIT | ARG_TYPE_BOOLEAN: r_type = Variant::ARRAY; break; + case ARG_ARRAY_BIT | ARG_TYPE_BYTE: + r_type = Variant::RAW_ARRAY; + likelyhood = 1.0; + break; + case ARG_ARRAY_BIT | ARG_TYPE_CHAR: + r_type = Variant::RAW_ARRAY; + likelyhood = 0.5; + break; + case ARG_ARRAY_BIT | ARG_TYPE_SHORT: + r_type = Variant::INT_ARRAY; + likelyhood = 0.3; + break; + case ARG_ARRAY_BIT | ARG_TYPE_INT: + r_type = Variant::INT_ARRAY; + likelyhood = 1.0; + break; + case ARG_ARRAY_BIT | ARG_TYPE_LONG: + r_type = Variant::INT_ARRAY; + likelyhood = 0.5; + break; + case ARG_ARRAY_BIT | ARG_TYPE_FLOAT: + r_type = Variant::REAL_ARRAY; + likelyhood = 1.0; + break; + case ARG_ARRAY_BIT | ARG_TYPE_DOUBLE: + r_type = Variant::REAL_ARRAY; + likelyhood = 0.5; + break; + case ARG_ARRAY_BIT | ARG_TYPE_STRING: r_type = Variant::STRING_ARRAY; break; + case ARG_ARRAY_BIT | ARG_TYPE_CLASS: r_type = Variant::ARRAY; break; } } - _FORCE_INLINE_ static bool _convert_object_to_variant(JNIEnv * env, jobject obj, Variant& var,uint32_t p_sig); + _FORCE_INLINE_ static bool _convert_object_to_variant(JNIEnv *env, jobject obj, Variant &var, uint32_t p_sig); + bool _call_method(JavaObject *p_instance, const StringName &p_method, const Variant **p_args, int p_argcount, Variant::CallError &r_error, Variant &ret); - - bool _call_method(JavaObject* p_instance,const StringName& p_method,const Variant** p_args,int p_argcount,Variant::CallError &r_error,Variant& ret); - -friend class JavaClassWrapper; - Map<StringName,List<MethodInfo> > methods; + friend class JavaClassWrapper; + Map<StringName, List<MethodInfo> > methods; jclass _class; public: - - virtual Variant call(const StringName& p_method,const Variant** p_args,int p_argcount,Variant::CallError &r_error); + virtual Variant call(const StringName &p_method, const Variant **p_args, int p_argcount, Variant::CallError &r_error); JavaClass(); - }; - class JavaObject : public Reference { - OBJ_TYPE(JavaObject,Reference); + OBJ_TYPE(JavaObject, Reference); Ref<JavaClass> base_class; -friend class JavaClass; + friend class JavaClass; jobject instance; public: + virtual Variant call(const StringName &p_method, const Variant **p_args, int p_argcount, Variant::CallError &r_error); - virtual Variant call(const StringName& p_method,const Variant** p_args,int p_argcount,Variant::CallError &r_error); - - JavaObject(const Ref<JavaClass>& p_base,jobject *p_instance); + JavaObject(const Ref<JavaClass> &p_base, jobject *p_instance); ~JavaObject(); - }; - class JavaClassWrapper : public Object { - OBJ_TYPE(JavaClassWrapper,Object); + OBJ_TYPE(JavaClassWrapper, Object); - - Map<String,Ref<JavaClass> > class_cache; -friend class JavaClass; + Map<String, Ref<JavaClass> > class_cache; + friend class JavaClass; jclass activityClass; jmethodID findClass; jmethodID getDeclaredMethods; @@ -177,20 +208,19 @@ friend class JavaClass; jmethodID Double_doubleValue; jobject classLoader; - bool _get_type_sig(JNIEnv *env, jobject obj, uint32_t& sig, String&strsig); + bool _get_type_sig(JNIEnv *env, jobject obj, uint32_t &sig, String &strsig); static JavaClassWrapper *singleton; protected: - static void _bind_methods(); -public: +public: static JavaClassWrapper *get_singleton() { return singleton; } - Ref<JavaClass> wrap(const String& p_class); + Ref<JavaClass> wrap(const String &p_class); - JavaClassWrapper(jobject p_activity=NULL); + JavaClassWrapper(jobject p_activity = NULL); }; #endif // JAVA_CLASS_WRAPPER_H diff --git a/platform/android/java_glue.cpp b/platform/android/java_glue.cpp index 27219ac56..103a40d6b 100644 --- a/platform/android/java_glue.cpp +++ b/platform/android/java_glue.cpp @@ -29,38 +29,35 @@ #ifndef ANDROID_NATIVE_ACTIVITY #include "java_glue.h" -#include "os_android.h" -#include "main/main.h" -#include <unistd.h> -#include "file_access_jandroid.h" -#include "file_access_android.h" -#include "dir_access_jandroid.h" +#include "android/asset_manager_jni.h" #include "audio_driver_jandroid.h" -#include "globals.h" -#include "thread_jandroid.h" #include "core/os/keyboard.h" +#include "dir_access_jandroid.h" +#include "file_access_android.h" +#include "file_access_jandroid.h" +#include "globals.h" #include "java_class_wrapper.h" -#include "android/asset_manager_jni.h" #include "main/input_default.h" +#include "main/main.h" +#include "os_android.h" +#include "thread_jandroid.h" +#include <unistd.h> -static JavaClassWrapper *java_class_wrapper=NULL; -static OS_Android *os_android=NULL; - +static JavaClassWrapper *java_class_wrapper = NULL; +static OS_Android *os_android = NULL; struct jvalret { jobject obj; jvalue val; - jvalret() { obj=NULL; } - - + jvalret() { obj = NULL; } }; -jvalret _variant_to_jvalue(JNIEnv *env, Variant::Type p_type, const Variant* p_arg, bool force_jobject = false) { +jvalret _variant_to_jvalue(JNIEnv *env, Variant::Type p_type, const Variant *p_arg, bool force_jobject = false) { jvalret v; - switch(p_type) { + switch (p_type) { case Variant::BOOL: { @@ -71,11 +68,10 @@ jvalret _variant_to_jvalue(JNIEnv *env, Variant::Type p_type, const Variant* p_a val.z = (bool)(*p_arg); jobject obj = env->NewObjectA(bclass, ctor, &val); v.val.l = obj; - v.obj=obj; + v.obj = obj; env->DeleteLocalRef(bclass); } else { - v.val.z=*p_arg; - + v.val.z = *p_arg; }; } break; case Variant::INT: { @@ -88,12 +84,11 @@ jvalret _variant_to_jvalue(JNIEnv *env, Variant::Type p_type, const Variant* p_a val.i = (int)(*p_arg); jobject obj = env->NewObjectA(bclass, ctor, &val); v.val.l = obj; - v.obj=obj; + v.obj = obj; env->DeleteLocalRef(bclass); } else { - v.val.i=*p_arg; - + v.val.i = *p_arg; }; } break; case Variant::REAL: { @@ -106,33 +101,33 @@ jvalret _variant_to_jvalue(JNIEnv *env, Variant::Type p_type, const Variant* p_a val.d = (double)(*p_arg); jobject obj = env->NewObjectA(bclass, ctor, &val); v.val.l = obj; - v.obj=obj; + v.obj = obj; env->DeleteLocalRef(bclass); } else { - v.val.f=*p_arg; + v.val.f = *p_arg; }; } break; case Variant::STRING: { String s = *p_arg; jstring jStr = env->NewStringUTF(s.utf8().get_data()); - v.val.l=jStr; - v.obj=jStr; + v.val.l = jStr; + v.obj = jStr; } break; case Variant::STRING_ARRAY: { DVector<String> sarray = *p_arg; - jobjectArray arr = env->NewObjectArray(sarray.size(),env->FindClass("java/lang/String"),env->NewStringUTF("")); + jobjectArray arr = env->NewObjectArray(sarray.size(), env->FindClass("java/lang/String"), env->NewStringUTF("")); - for(int j=0;j<sarray.size();j++) { + for (int j = 0; j < sarray.size(); j++) { - jstring str = env->NewStringUTF( sarray[j].utf8().get_data() ); - env->SetObjectArrayElement(arr,j,str); + jstring str = env->NewStringUTF(sarray[j].utf8().get_data()); + env->SetObjectArrayElement(arr, j, str); env->DeleteLocalRef(str); } - v.val.l=arr; - v.obj=arr; + v.val.l = arr; + v.obj = arr; } break; @@ -146,7 +141,7 @@ jvalret _variant_to_jvalue(JNIEnv *env, Variant::Type p_type, const Variant* p_a Array keys = dict.keys(); jobjectArray jkeys = env->NewObjectArray(keys.size(), env->FindClass("java/lang/String"), env->NewStringUTF("")); - for (int j=0; j<keys.size(); j++) { + for (int j = 0; j < keys.size(); j++) { jstring str = env->NewStringUTF(String(keys[j]).utf8().get_data()); env->SetObjectArrayElement(jkeys, j, str); env->DeleteLocalRef(str); @@ -160,7 +155,7 @@ jvalret _variant_to_jvalue(JNIEnv *env, Variant::Type p_type, const Variant* p_a jobjectArray jvalues = env->NewObjectArray(keys.size(), env->FindClass("java/lang/Object"), NULL); - for (int j=0; j<keys.size(); j++) { + for (int j = 0; j < keys.size(); j++) { Variant var = dict[keys[j]]; jvalret v = _variant_to_jvalue(env, var.get_type(), &var, true); env->SetObjectArrayElement(jvalues, j, v.val.l); @@ -176,7 +171,7 @@ jvalret _variant_to_jvalue(JNIEnv *env, Variant::Type p_type, const Variant* p_a env->DeleteLocalRef(dclass); v.val.l = jdict; - v.obj=jdict; + v.obj = jdict; } break; case Variant::INT_ARRAY: { @@ -184,18 +179,18 @@ jvalret _variant_to_jvalue(JNIEnv *env, Variant::Type p_type, const Variant* p_a DVector<int> array = *p_arg; jintArray arr = env->NewIntArray(array.size()); DVector<int>::Read r = array.read(); - env->SetIntArrayRegion(arr,0,array.size(),r.ptr()); - v.val.l=arr; - v.obj=arr; + env->SetIntArrayRegion(arr, 0, array.size(), r.ptr()); + v.val.l = arr; + v.obj = 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.val.l=arr; - v.obj=arr; + env->SetByteArrayRegion(arr, 0, array.size(), reinterpret_cast<const signed char *>(r.ptr())); + v.val.l = arr; + v.obj = arr; } break; case Variant::REAL_ARRAY: { @@ -203,57 +198,53 @@ jvalret _variant_to_jvalue(JNIEnv *env, Variant::Type p_type, const Variant* p_a DVector<float> array = *p_arg; jfloatArray arr = env->NewFloatArray(array.size()); DVector<float>::Read r = array.read(); - env->SetFloatArrayRegion(arr,0,array.size(),r.ptr()); - v.val.l=arr; - v.obj=arr; + env->SetFloatArrayRegion(arr, 0, array.size(), r.ptr()); + v.val.l = arr; + v.obj = arr; } break; default: { v.val.i = 0; } break; - } return v; } -String _get_class_name(JNIEnv * env, jclass cls, bool* array) { +String _get_class_name(JNIEnv *env, jclass cls, bool *array) { jclass cclass = env->FindClass("java/lang/Class"); jmethodID getName = env->GetMethodID(cclass, "getName", "()Ljava/lang/String;"); - jstring clsName=(jstring) env->CallObjectMethod(cls, getName); + jstring clsName = (jstring)env->CallObjectMethod(cls, getName); if (array) { jmethodID isArray = env->GetMethodID(cclass, "isArray", "()Z"); jboolean isarr = env->CallBooleanMethod(cls, isArray); (*array) = isarr ? true : false; } - String name = env->GetStringUTFChars( clsName, NULL ); + String name = env->GetStringUTFChars(clsName, NULL); env->DeleteLocalRef(clsName); return name; - } - -Variant _jobject_to_variant(JNIEnv * env, jobject obj) { +Variant _jobject_to_variant(JNIEnv *env, jobject obj) { if (obj == NULL) { return Variant(); } - + jclass c = env->GetObjectClass(obj); bool array; String name = _get_class_name(env, c, &array); //print_line("name is " + name + ", array "+Variant(array)); - print_line("ARGNAME: "+name); + print_line("ARGNAME: " + name); if (name == "java.lang.String") { - return String::utf8(env->GetStringUTFChars( (jstring)obj, NULL )); + return String::utf8(env->GetStringUTFChars((jstring)obj, NULL)); }; - if (name == "[Ljava.lang.String;") { jobjectArray arr = (jobjectArray)obj; @@ -261,11 +252,10 @@ Variant _jobject_to_variant(JNIEnv * env, jobject obj) { //print_line("String array! " + String::num(stringCount)); DVector<String> sarr; - for (int i=0; i<stringCount; i++) { - jstring string = (jstring) env->GetObjectArrayElement(arr, i); + for (int i = 0; i < stringCount; i++) { + jstring string = (jstring)env->GetObjectArrayElement(arr, i); sarr.push_back(String::utf8(env->GetStringUTFChars(string, NULL))); env->DeleteLocalRef(string); - } return sarr; @@ -294,7 +284,7 @@ Variant _jobject_to_variant(JNIEnv * env, jobject obj) { sarr.resize(fCount); DVector<int>::Write w = sarr.write(); - env->GetIntArrayRegion(arr,0,fCount,w.ptr()); + env->GetIntArrayRegion(arr, 0, fCount, w.ptr()); w = DVector<int>::Write(); return sarr; }; @@ -307,7 +297,7 @@ Variant _jobject_to_variant(JNIEnv * env, jobject obj) { sarr.resize(fCount); DVector<uint8_t>::Write w = sarr.write(); - env->GetByteArrayRegion(arr,0,fCount,reinterpret_cast<signed char*>(w.ptr())); + env->GetByteArrayRegion(arr, 0, fCount, reinterpret_cast<signed char *>(w.ptr())); w = DVector<uint8_t>::Write(); return sarr; }; @@ -329,12 +319,11 @@ Variant _jobject_to_variant(JNIEnv * env, jobject obj) { RealArray::Write w = sarr.write(); - for (int i=0; i<fCount; i++) { + for (int i = 0; i < fCount; i++) { double n; env->GetDoubleArrayRegion(arr, i, 1, &n); w.ptr()[i] = n; - }; return sarr; }; @@ -346,38 +335,34 @@ Variant _jobject_to_variant(JNIEnv * env, jobject obj) { RealArray sarr; sarr.resize(fCount); - RealArray::Write w = sarr.write(); - for (int i=0; i<fCount; i++) { + for (int i = 0; i < fCount; i++) { float n; env->GetFloatArrayRegion(arr, i, 1, &n); w.ptr()[i] = n; - }; return sarr; }; - if (name == "[Ljava.lang.Object;") { jobjectArray arr = (jobjectArray)obj; int objCount = env->GetArrayLength(arr); Array varr(true); - for (int i=0; i<objCount; i++) { + for (int i = 0; i < objCount; i++) { jobject jobj = env->GetObjectArrayElement(arr, i); Variant v = _jobject_to_variant(env, jobj); varr.push_back(v); env->DeleteLocalRef(jobj); - } return varr; }; - if (name == "java.util.HashMap" || name == "org.godotengine.godot.Dictionary") { + if (name == "java.util.HashMap" || name == "org.godotengine.godot.Dictionary") { Dictionary ret(true); jclass oclass = c; @@ -394,12 +379,11 @@ Variant _jobject_to_variant(JNIEnv * env, jobject obj) { env->DeleteLocalRef(arr); //print_line("adding " + String::num(keys.size()) + " to Dictionary!"); - for (int i=0; i<keys.size(); i++) { + for (int i = 0; i < keys.size(); i++) { ret[keys[i]] = vals[i]; }; - return ret; }; @@ -410,84 +394,77 @@ Variant _jobject_to_variant(JNIEnv * env, jobject obj) { class JNISingleton : public Object { - OBJ_TYPE( JNISingleton, Object ); - + OBJ_TYPE(JNISingleton, Object); struct MethodData { - jmethodID method; Variant::Type ret_type; Vector<Variant::Type> argtypes; }; jobject instance; - Map<StringName,MethodData> method_map; + Map<StringName, MethodData> method_map; public: - - virtual Variant call(const StringName& p_method,const Variant** p_args,int p_argcount,Variant::CallError &r_error) { + 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()); + ERR_FAIL_COND_V(!instance, Variant()); - r_error.error=Variant::CallError::CALL_OK; + r_error.error = Variant::CallError::CALL_OK; - Map<StringName,MethodData >::Element *E=method_map.find(p_method); + Map<StringName, MethodData>::Element *E = method_map.find(p_method); if (!E) { print_line("no exists"); - r_error.error=Variant::CallError::CALL_ERROR_INVALID_METHOD; + r_error.error = Variant::CallError::CALL_ERROR_INVALID_METHOD; return Variant(); } - - int ac = E->get().argtypes.size(); - if (ac<p_argcount) { + if (ac < p_argcount) { print_line("fewargs"); - r_error.error=Variant::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS; - r_error.argument=ac; + r_error.error = Variant::CallError::CALL_ERROR_TOO_FEW_ARGUMENTS; + r_error.argument = ac; return Variant(); } - if (ac>p_argcount) { + if (ac > p_argcount) { print_line("manyargs"); - r_error.error=Variant::CallError::CALL_ERROR_TOO_MANY_ARGUMENTS; - r_error.argument=ac; + r_error.error = Variant::CallError::CALL_ERROR_TOO_MANY_ARGUMENTS; + r_error.argument = ac; return Variant(); } + for (int i = 0; i < p_argcount; i++) { - for(int i=0;i<p_argcount;i++) { + if (!Variant::can_convert(p_args[i]->get_type(), E->get().argtypes[i])) { - if (!Variant::can_convert(p_args[i]->get_type(),E->get().argtypes[i])) { - - r_error.error=Variant::CallError::CALL_ERROR_INVALID_ARGUMENT; - r_error.argument=i; - r_error.expected=E->get().argtypes[i]; + r_error.error = Variant::CallError::CALL_ERROR_INVALID_ARGUMENT; + r_error.argument = i; + r_error.expected = E->get().argtypes[i]; } } - - jvalue *v=NULL; + jvalue *v = NULL; if (p_argcount) { - v=(jvalue*)alloca( sizeof(jvalue)*p_argcount ); + v = (jvalue *)alloca(sizeof(jvalue) * p_argcount); } JNIEnv *env = ThreadAndroid::get_env(); int res = env->PushLocalFrame(16); - ERR_FAIL_COND_V(res!=0,Variant()); + ERR_FAIL_COND_V(res != 0, Variant()); //print_line("argcount "+String::num(p_argcount)); List<jobject> to_erase; - for(int i=0;i<p_argcount;i++) { + for (int i = 0; i < p_argcount; i++) { jvalret vr = _variant_to_jvalue(env, E->get().argtypes[i], p_args[i]); v[i] = vr.val; @@ -499,37 +476,36 @@ public: Variant ret; - switch(E->get().ret_type) { + switch (E->get().ret_type) { case Variant::NIL: { - //print_line("call void"); - env->CallVoidMethodA(instance,E->get().method,v); + env->CallVoidMethodA(instance, E->get().method, v); } break; case Variant::BOOL: { - ret = env->CallBooleanMethodA(instance,E->get().method,v)==JNI_TRUE; + ret = env->CallBooleanMethodA(instance, E->get().method, v) == JNI_TRUE; //print_line("call bool"); } break; case Variant::INT: { - ret = env->CallIntMethodA(instance,E->get().method,v); + ret = env->CallIntMethodA(instance, E->get().method, v); //print_line("call int"); } break; case Variant::REAL: { - ret = env->CallFloatMethodA(instance,E->get().method,v); + ret = env->CallFloatMethodA(instance, E->get().method, v); } break; 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)); env->DeleteLocalRef(o); } break; case Variant::STRING_ARRAY: { - jobjectArray arr = (jobjectArray)env->CallObjectMethodA(instance,E->get().method,v); + jobjectArray arr = (jobjectArray)env->CallObjectMethodA(instance, E->get().method, v); ret = _jobject_to_variant(env, arr); @@ -537,30 +513,30 @@ public: } break; case Variant::INT_ARRAY: { - jintArray arr = (jintArray)env->CallObjectMethodA(instance,E->get().method,v); + jintArray arr = (jintArray)env->CallObjectMethodA(instance, E->get().method, v); int fCount = env->GetArrayLength(arr); DVector<int> sarr; sarr.resize(fCount); DVector<int>::Write w = sarr.write(); - env->GetIntArrayRegion(arr,0,fCount,w.ptr()); + env->GetIntArrayRegion(arr, 0, fCount, w.ptr()); w = DVector<int>::Write(); - ret=sarr; + ret = sarr; env->DeleteLocalRef(arr); } break; case Variant::REAL_ARRAY: { - jfloatArray arr = (jfloatArray)env->CallObjectMethodA(instance,E->get().method,v); + jfloatArray arr = (jfloatArray)env->CallObjectMethodA(instance, E->get().method, v); int fCount = env->GetArrayLength(arr); DVector<float> sarr; sarr.resize(fCount); DVector<float>::Write w = sarr.write(); - env->GetFloatArrayRegion(arr,0,fCount,w.ptr()); + env->GetFloatArrayRegion(arr, 0, fCount, w.ptr()); w = DVector<float>::Write(); - ret=sarr; + ret = sarr; env->DeleteLocalRef(arr); } break; @@ -574,7 +550,6 @@ public: } break; default: { - print_line("failure.."); env->PopLocalFrame(NULL); ERR_FAIL_V(Variant()); @@ -592,42 +567,35 @@ public: return ret; } - jobject get_instance() const { return instance; } void set_instance(jobject p_instance) { - instance=p_instance; + instance = p_instance; } - - void add_method(const StringName& p_name, jmethodID p_method,const Vector<Variant::Type>& p_args, Variant::Type p_ret_type) { + void add_method(const StringName &p_name, jmethodID p_method, const Vector<Variant::Type> &p_args, Variant::Type p_ret_type) { MethodData md; - md.method=p_method; - md.argtypes=p_args; - md.ret_type=p_ret_type; - method_map[p_name]=md; - + md.method = p_method; + md.argtypes = p_args; + md.ret_type = p_ret_type; + method_map[p_name] = md; } - JNISingleton() { - instance=NULL; - + instance = NULL; } - }; - struct TST { int a; TST() { - a=5; + a = 5; } }; @@ -643,114 +611,111 @@ struct JAndroidPointerEvent { static List<JAndroidPointerEvent> pointer_events; static List<InputEvent> key_events; static List<OS_Android::JoystickEvent> joy_events; -static bool initialized=false; -static Mutex *input_mutex=NULL; -static Mutex *suspend_mutex=NULL; -static int step=0; -static bool resized=false; -static bool resized_reload=false; -static bool quit_request=false; +static bool initialized = false; +static Mutex *input_mutex = NULL; +static Mutex *suspend_mutex = NULL; +static int step = 0; +static bool resized = false; +static bool resized_reload = false; +static bool quit_request = false; static Size2 new_size; static Vector3 accelerometer; static Vector3 magnetometer; static Vector3 gyroscope; -static HashMap<String,JNISingleton*> jni_singletons; +static HashMap<String, JNISingleton *> jni_singletons; static jobject godot_io; static Vector<int> joy_device_ids; -typedef void (*GFXInitFunc)(void *ud,bool gl2); +typedef void (*GFXInitFunc)(void *ud, bool gl2); -static jmethodID _on_video_init=0; +static jmethodID _on_video_init = 0; static jobject _godot_instance; -static jmethodID _openURI=0; -static jmethodID _getDataDir=0; -static jmethodID _getLocale=0; -static jmethodID _getModel=0; -static jmethodID _getScreenDPI=0; -static jmethodID _showKeyboard=0; -static jmethodID _hideKeyboard=0; -static jmethodID _setScreenOrientation=0; -static jmethodID _getUniqueID=0; -static jmethodID _getSystemDir=0; -static jmethodID _playVideo=0; -static jmethodID _isVideoPlaying=0; -static jmethodID _pauseVideo=0; -static jmethodID _stopVideo=0; -static jmethodID _setKeepScreenOn=0; -static jmethodID _alertDialog=0; - -static void _gfx_init_func(void* ud, bool gl2) { +static jmethodID _openURI = 0; +static jmethodID _getDataDir = 0; +static jmethodID _getLocale = 0; +static jmethodID _getModel = 0; +static jmethodID _getScreenDPI = 0; +static jmethodID _showKeyboard = 0; +static jmethodID _hideKeyboard = 0; +static jmethodID _setScreenOrientation = 0; +static jmethodID _getUniqueID = 0; +static jmethodID _getSystemDir = 0; +static jmethodID _playVideo = 0; +static jmethodID _isVideoPlaying = 0; +static jmethodID _pauseVideo = 0; +static jmethodID _stopVideo = 0; +static jmethodID _setKeepScreenOn = 0; +static jmethodID _alertDialog = 0; +static void _gfx_init_func(void *ud, bool gl2) { } - -static int _open_uri(const String& p_uri) { +static int _open_uri(const String &p_uri) { JNIEnv *env = ThreadAndroid::get_env(); jstring jStr = env->NewStringUTF(p_uri.utf8().get_data()); - return env->CallIntMethod(godot_io,_openURI,jStr) ; + return env->CallIntMethod(godot_io, _openURI, jStr); } static String _get_data_dir() { JNIEnv *env = ThreadAndroid::get_env(); - jstring s =(jstring)env->CallObjectMethod(godot_io,_getDataDir); - return String(env->GetStringUTFChars( s, NULL )); + jstring s = (jstring)env->CallObjectMethod(godot_io, _getDataDir); + return String(env->GetStringUTFChars(s, NULL)); } static String _get_locale() { JNIEnv *env = ThreadAndroid::get_env(); - jstring s =(jstring)env->CallObjectMethod(godot_io,_getLocale); - return String(env->GetStringUTFChars( s, NULL )); + jstring s = (jstring)env->CallObjectMethod(godot_io, _getLocale); + return String(env->GetStringUTFChars(s, NULL)); } static String _get_model() { - JNIEnv *env = ThreadAndroid::get_env(); - jstring s =(jstring)env->CallObjectMethod(godot_io,_getModel); - return String(env->GetStringUTFChars( s, NULL )); + JNIEnv *env = ThreadAndroid::get_env(); + jstring s = (jstring)env->CallObjectMethod(godot_io, _getModel); + return String(env->GetStringUTFChars(s, NULL)); } static int _get_screen_dpi() { JNIEnv *env = ThreadAndroid::get_env(); - return env->CallIntMethod(godot_io,_getScreenDPI); + return env->CallIntMethod(godot_io, _getScreenDPI); } static String _get_unique_id() { - JNIEnv *env = ThreadAndroid::get_env(); - jstring s =(jstring)env->CallObjectMethod(godot_io,_getUniqueID); - return String(env->GetStringUTFChars( s, NULL )); + JNIEnv *env = ThreadAndroid::get_env(); + jstring s = (jstring)env->CallObjectMethod(godot_io, _getUniqueID); + return String(env->GetStringUTFChars(s, NULL)); } -static void _show_vk(const String& p_existing) { +static void _show_vk(const String &p_existing) { - JNIEnv* env = ThreadAndroid::get_env(); + JNIEnv *env = ThreadAndroid::get_env(); jstring jStr = env->NewStringUTF(p_existing.utf8().get_data()); env->CallVoidMethod(godot_io, _showKeyboard, jStr); } static void _set_screen_orient(int p_orient) { - JNIEnv* env = ThreadAndroid::get_env(); - env->CallVoidMethod(godot_io, _setScreenOrientation, p_orient ); + JNIEnv *env = ThreadAndroid::get_env(); + env->CallVoidMethod(godot_io, _setScreenOrientation, p_orient); } static String _get_system_dir(int p_dir) { JNIEnv *env = ThreadAndroid::get_env(); - jstring s =(jstring)env->CallObjectMethod(godot_io,_getSystemDir,p_dir); - return String(env->GetStringUTFChars( s, NULL )); + jstring s = (jstring)env->CallObjectMethod(godot_io, _getSystemDir, p_dir); + return String(env->GetStringUTFChars(s, NULL)); } - static void _hide_vk() { - JNIEnv* env = ThreadAndroid::get_env(); + JNIEnv *env = ThreadAndroid::get_env(); env->CallVoidMethod(godot_io, _hideKeyboard); } @@ -759,52 +724,50 @@ static void _hide_vk() { // virtual void native_video_pause(); // virtual void native_video_stop(); -static void _play_video(const String& p_path) { - +static void _play_video(const String &p_path) { } static bool _is_video_playing() { - JNIEnv* env = ThreadAndroid::get_env(); + JNIEnv *env = ThreadAndroid::get_env(); return env->CallBooleanMethod(godot_io, _isVideoPlaying); //return false; } static void _pause_video() { - JNIEnv* env = ThreadAndroid::get_env(); + JNIEnv *env = ThreadAndroid::get_env(); env->CallVoidMethod(godot_io, _pauseVideo); } static void _stop_video() { - JNIEnv* env = ThreadAndroid::get_env(); + JNIEnv *env = ThreadAndroid::get_env(); env->CallVoidMethod(godot_io, _stopVideo); } static void _set_keep_screen_on(bool p_enabled) { - JNIEnv* env = ThreadAndroid::get_env(); + JNIEnv *env = ThreadAndroid::get_env(); env->CallVoidMethod(_godot_instance, _setKeepScreenOn, p_enabled); } -static void _alert(const String& p_message, const String& p_title) { - JNIEnv* env = ThreadAndroid::get_env(); +static void _alert(const String &p_message, const String &p_title) { + JNIEnv *env = ThreadAndroid::get_env(); jstring jStrMessage = env->NewStringUTF(p_message.utf8().get_data()); jstring jStrTitle = env->NewStringUTF(p_title.utf8().get_data()); env->CallVoidMethod(_godot_instance, _alertDialog, jStrMessage, jStrTitle); } -JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_initialize(JNIEnv * env, jobject obj, jobject activity,jboolean p_need_reload_hook, jobjectArray p_cmdline,jobject p_asset_manager) { - - __android_log_print(ANDROID_LOG_INFO,"godot","**INIT EVENT! - %p\n",env); +JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_initialize(JNIEnv *env, jobject obj, jobject activity, jboolean p_need_reload_hook, jobjectArray p_cmdline, jobject p_asset_manager) { + __android_log_print(ANDROID_LOG_INFO, "godot", "**INIT EVENT! - %p\n", env); - initialized=true; + initialized = true; JavaVM *jvm; env->GetJavaVM(&jvm); - _godot_instance=env->NewGlobalRef(activity); -// _godot_instance=activity; + _godot_instance = env->NewGlobalRef(activity); + // _godot_instance=activity; - __android_log_print(ANDROID_LOG_INFO,"godot","***************** HELLO FROM JNI!!!!!!!!"); + __android_log_print(ANDROID_LOG_INFO, "godot", "***************** HELLO FROM JNI!!!!!!!!"); { //setup IO Object @@ -812,41 +775,41 @@ JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_initialize(JNIEnv * e jclass cls = env->FindClass("org/godotengine/godot/Godot"); if (cls) { - cls=(jclass)env->NewGlobalRef(cls); - __android_log_print(ANDROID_LOG_INFO,"godot","*******CLASS FOUND!!!"); + cls = (jclass)env->NewGlobalRef(cls); + __android_log_print(ANDROID_LOG_INFO, "godot", "*******CLASS FOUND!!!"); } - __android_log_print(ANDROID_LOG_INFO,"godot","STEP2, %p",cls); + __android_log_print(ANDROID_LOG_INFO, "godot", "STEP2, %p", cls); jfieldID fid = env->GetStaticFieldID(cls, "io", "Lorg/godotengine/godot/GodotIO;"); - __android_log_print(ANDROID_LOG_INFO,"godot","STEP3 %i",fid); - jobject ob = env->GetStaticObjectField(cls,fid); - __android_log_print(ANDROID_LOG_INFO,"godot","STEP4, %p",ob); + __android_log_print(ANDROID_LOG_INFO, "godot", "STEP3 %i", fid); + jobject ob = env->GetStaticObjectField(cls, fid); + __android_log_print(ANDROID_LOG_INFO, "godot", "STEP4, %p", ob); jobject gob = env->NewGlobalRef(ob); - __android_log_print(ANDROID_LOG_INFO,"godot","STEP4.5, %p",gob); - godot_io=gob; + __android_log_print(ANDROID_LOG_INFO, "godot", "STEP4.5, %p", gob); + godot_io = gob; _on_video_init = env->GetMethodID(cls, "onVideoInit", "(Z)V"); - _setKeepScreenOn = env->GetMethodID(cls,"setKeepScreenOn","(Z)V"); - _alertDialog = env->GetMethodID(cls,"alert","(Ljava/lang/String;Ljava/lang/String;)V"); + _setKeepScreenOn = env->GetMethodID(cls, "setKeepScreenOn", "(Z)V"); + _alertDialog = env->GetMethodID(cls, "alert", "(Ljava/lang/String;Ljava/lang/String;)V"); jclass clsio = env->FindClass("org/godotengine/godot/Godot"); if (cls) { jclass c = env->GetObjectClass(gob); - _openURI = env->GetMethodID(c,"openURI","(Ljava/lang/String;)I"); - _getDataDir = env->GetMethodID(c,"getDataDir","()Ljava/lang/String;"); - _getLocale = env->GetMethodID(c,"getLocale","()Ljava/lang/String;"); - _getModel = env->GetMethodID(c,"getModel","()Ljava/lang/String;"); - _getScreenDPI = env->GetMethodID(c, "getScreenDPI","()I"); - _getUniqueID = env->GetMethodID(c,"getUniqueID","()Ljava/lang/String;"); - _showKeyboard = env->GetMethodID(c,"showKeyboard","(Ljava/lang/String;)V"); - _hideKeyboard = env->GetMethodID(c,"hideKeyboard","()V"); - _setScreenOrientation = env->GetMethodID(c,"setScreenOrientation","(I)V"); - _getSystemDir = env->GetMethodID(c,"getSystemDir","(I)Ljava/lang/String;"); - _playVideo = env->GetMethodID(c,"playVideo","(Ljava/lang/String;)V"); - _isVideoPlaying = env->GetMethodID(c,"isVideoPlaying","()Z"); - _pauseVideo = env->GetMethodID(c,"pauseVideo","()V"); - _stopVideo = env->GetMethodID(c,"stopVideo","()V"); + _openURI = env->GetMethodID(c, "openURI", "(Ljava/lang/String;)I"); + _getDataDir = env->GetMethodID(c, "getDataDir", "()Ljava/lang/String;"); + _getLocale = env->GetMethodID(c, "getLocale", "()Ljava/lang/String;"); + _getModel = env->GetMethodID(c, "getModel", "()Ljava/lang/String;"); + _getScreenDPI = env->GetMethodID(c, "getScreenDPI", "()I"); + _getUniqueID = env->GetMethodID(c, "getUniqueID", "()Ljava/lang/String;"); + _showKeyboard = env->GetMethodID(c, "showKeyboard", "(Ljava/lang/String;)V"); + _hideKeyboard = env->GetMethodID(c, "hideKeyboard", "()V"); + _setScreenOrientation = env->GetMethodID(c, "setScreenOrientation", "(I)V"); + _getSystemDir = env->GetMethodID(c, "getSystemDir", "(I)Ljava/lang/String;"); + _playVideo = env->GetMethodID(c, "playVideo", "(Ljava/lang/String;)V"); + _isVideoPlaying = env->GetMethodID(c, "isVideoPlaying", "()Z"); + _pauseVideo = env->GetMethodID(c, "pauseVideo", "()V"); + _stopVideo = env->GetMethodID(c, "stopVideo", "()V"); } ThreadAndroid::make_default(jvm); @@ -856,89 +819,84 @@ JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_initialize(JNIEnv * e jobject amgr = env->NewGlobalRef(p_asset_manager); - FileAccessAndroid::asset_manager=AAssetManager_fromJava(env,amgr); + FileAccessAndroid::asset_manager = AAssetManager_fromJava(env, amgr); #endif DirAccessJAndroid::setup(gob); AudioDriverAndroid::setup(gob); } - - const char ** cmdline=NULL; - int cmdlen=0; - bool use_apk_expansion=false; + 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; + cmdline = (const char **)malloc((env->GetArrayLength(p_cmdline) + 1) * sizeof(const char *)); + cmdline[cmdlen] = NULL; - for (int i=0; i<cmdlen; i++) { + for (int i = 0; i < cmdlen; i++) { - jstring string = (jstring) env->GetObjectArrayElement(p_cmdline, 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); + __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); + // __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; + if (strcmp(rawString, "-main_pack") == 0) + use_apk_expansion = true; } - cmdline[i]=rawString; + cmdline[i] = rawString; } } } - __android_log_print(ANDROID_LOG_INFO,"godot","CMDLINE LEN %i - APK EXPANSION %I\n",cmdlen,int(use_apk_expansion)); + __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, _get_screen_dpi, _show_vk, _hide_vk,_set_screen_orient,_get_unique_id, _get_system_dir, _play_video,_is_video_playing, _pause_video, _stop_video, _set_keep_screen_on, _alert, use_apk_expansion); + os_android = new OS_Android(_gfx_init_func, env, _open_uri, _get_data_dir, _get_locale, _get_model, _get_screen_dpi, _show_vk, _hide_vk, _set_screen_orient, _get_unique_id, _get_system_dir, _play_video, _is_video_playing, _pause_video, _stop_video, _set_keep_screen_on, _alert, use_apk_expansion); os_android->set_need_reload_hooks(p_need_reload_hook); char wd[500]; - getcwd(wd,500); + getcwd(wd, 500); - __android_log_print(ANDROID_LOG_INFO,"godot","test construction %i\n",tst.a); - __android_log_print(ANDROID_LOG_INFO,"godot","running from dir %s\n",wd); - - __android_log_print(ANDROID_LOG_INFO,"godot","**SETUP"); + __android_log_print(ANDROID_LOG_INFO, "godot", "test construction %i\n", tst.a); + __android_log_print(ANDROID_LOG_INFO, "godot", "running from dir %s\n", wd); + __android_log_print(ANDROID_LOG_INFO, "godot", "**SETUP"); #if 0 char *args[]={"-test","render",NULL}; __android_log_print(ANDROID_LOG_INFO,"godot","pre asdasd setup..."); Error err = Main::setup("apk",2,args,false); #else - Error err = Main::setup("apk",cmdlen,(char**)cmdline,false); + Error err = Main::setup("apk", cmdlen, (char **)cmdline, false); #endif - if (err!=OK) { - __android_log_print(ANDROID_LOG_INFO,"godot","*****UNABLE TO SETUP"); + if (err != OK) { + __android_log_print(ANDROID_LOG_INFO, "godot", "*****UNABLE TO SETUP"); return; //should exit instead and print the error } - __android_log_print(ANDROID_LOG_INFO,"godot","*****SETUP OK"); + __android_log_print(ANDROID_LOG_INFO, "godot", "*****SETUP OK"); //video driver is determined here, because once initialized, it cant be changed String vd = Globals::get_singleton()->get("display/driver"); + env->CallVoidMethod(_godot_instance, _on_video_init, (jboolean) true); - env->CallVoidMethod(_godot_instance, _on_video_init, (jboolean)true); - - __android_log_print(ANDROID_LOG_INFO,"godot","**START"); - - input_mutex=Mutex::create(); - suspend_mutex=Mutex::create(); - + __android_log_print(ANDROID_LOG_INFO, "godot", "**START"); + input_mutex = Mutex::create(); + suspend_mutex = Mutex::create(); } -JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_resize(JNIEnv * env, jobject obj, jint width, jint height, jboolean reload) { +JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_resize(JNIEnv *env, jobject obj, jint width, jint height, jboolean reload) { - __android_log_print(ANDROID_LOG_INFO,"godot","^_^_^_^_^ resize %lld, %i, %i\n",Thread::get_caller_ID(),width,height); + __android_log_print(ANDROID_LOG_INFO, "godot", "^_^_^_^_^ resize %lld, %i, %i\n", Thread::get_caller_ID(), width, height); if (os_android) - os_android->set_display_size(Size2(width,height)); + os_android->set_display_size(Size2(width, height)); /*input_mutex->lock(); resized=true; @@ -946,12 +904,11 @@ JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_resize(JNIEnv * env, resized_reload=true; new_size=Size2(width,height); input_mutex->unlock();*/ - } -JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_newcontext(JNIEnv * env, jobject obj,bool p_32_bits) { +JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_newcontext(JNIEnv *env, jobject obj, bool p_32_bits) { - __android_log_print(ANDROID_LOG_INFO,"godot","^_^_^_^_^ newcontext %lld\n",Thread::get_caller_ID()); + __android_log_print(ANDROID_LOG_INFO, "godot", "^_^_^_^_^ newcontext %lld\n", Thread::get_caller_ID()); if (os_android) { os_android->set_context_is_16_bits(!p_32_bits); @@ -961,25 +918,22 @@ JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_newcontext(JNIEnv * e os_android->reload_gfx(); } - } - -JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_quit(JNIEnv * env, jobject obj) { +JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_quit(JNIEnv *env, jobject obj) { input_mutex->lock(); - quit_request=true; + quit_request = true; print_line("BACK PRESSED"); input_mutex->unlock(); - } static void _initialize_java_modules() { String modules = Globals::get_singleton()->get("android/modules"); - Vector<String> mods = modules.split(",",false); - print_line("ANDROID MODULES : " + modules); - __android_log_print(ANDROID_LOG_INFO,"godot","mod count: %i",mods.size()); + Vector<String> mods = modules.split(",", false); + print_line("ANDROID MODULES : " + modules); + __android_log_print(ANDROID_LOG_INFO, "godot", "mod count: %i", mods.size()); if (mods.size()) { @@ -987,7 +941,7 @@ static void _initialize_java_modules() { jclass activityClass = env->FindClass("org/godotengine/godot/Godot"); - jmethodID getClassLoader = env->GetMethodID(activityClass,"getClassLoader", "()Ljava/lang/ClassLoader;"); + jmethodID getClassLoader = env->GetMethodID(activityClass, "getClassLoader", "()Ljava/lang/ClassLoader;"); jobject cls = env->CallObjectMethod(_godot_instance, getClassLoader); //cls=env->NewGlobalRef(cls); @@ -997,52 +951,43 @@ static void _initialize_java_modules() { jmethodID findClass = env->GetMethodID(classLoader, "loadClass", "(Ljava/lang/String;)Ljava/lang/Class;"); - for (int i=0;i<mods.size();i++) { + for (int i = 0; i < mods.size(); i++) { String m = mods[i]; //jclass singletonClass = env->FindClass(m.utf8().get_data()); - print_line("LOADING MODULE: "+m); + print_line("LOADING MODULE: " + m); jstring strClassName = env->NewStringUTF(m.utf8().get_data()); jclass singletonClass = (jclass)env->CallObjectMethod(cls, findClass, strClassName); if (!singletonClass) { - ERR_EXPLAIN("Couldn't find singleton for class: "+m); + ERR_EXPLAIN("Couldn't find singleton for class: " + m); ERR_CONTINUE(!singletonClass); } //singletonClass=(jclass)env->NewGlobalRef(singletonClass); - __android_log_print(ANDROID_LOG_INFO,"godot","****^*^*?^*^*class data %x",singletonClass); + __android_log_print(ANDROID_LOG_INFO, "godot", "****^*^*?^*^*class data %x", singletonClass); jmethodID initialize = env->GetStaticMethodID(singletonClass, "initialize", "(Landroid/app/Activity;)Lorg/godotengine/godot/Godot$SingletonBase;"); if (!initialize) { - ERR_EXPLAIN("Couldn't find proper initialize function 'public static Godot.SingletonBase Class::initialize(Activity p_activity)' initializer for singleton class: "+m); + ERR_EXPLAIN("Couldn't find proper initialize function 'public static Godot.SingletonBase Class::initialize(Activity p_activity)' initializer for singleton class: " + m); ERR_CONTINUE(!initialize); - } - jobject obj = env->CallStaticObjectMethod(singletonClass,initialize,_godot_instance); - __android_log_print(ANDROID_LOG_INFO,"godot","****^*^*?^*^*class instance %x",obj); + jobject obj = env->CallStaticObjectMethod(singletonClass, initialize, _godot_instance); + __android_log_print(ANDROID_LOG_INFO, "godot", "****^*^*?^*^*class instance %x", obj); jobject gob = env->NewGlobalRef(obj); - - } - } - } - -JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_step(JNIEnv * env, jobject obj) -{ - +JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_step(JNIEnv *env, jobject obj) { ThreadAndroid::setup_thread(); //__android_log_print(ANDROID_LOG_INFO,"godot","**STEP EVENT! - %p-%i\n",env,Thread::get_caller_ID()); - suspend_mutex->lock(); input_mutex->lock(); //first time step happens, initialize @@ -1050,8 +995,8 @@ JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_step(JNIEnv * env, jo // 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)); + java_class_wrapper = memnew(JavaClassWrapper(_godot_instance)); + Globals::get_singleton()->add_singleton(Globals::Singleton("JavaClassWrapper", java_class_wrapper)); _initialize_java_modules(); Main::setup2(); @@ -1072,10 +1017,10 @@ JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_step(JNIEnv * env, jo ++step; } - while(pointer_events.size()) { + while (pointer_events.size()) { - JAndroidPointerEvent jpe=pointer_events.front()->get(); - os_android->process_touch(jpe.what,jpe.pointer,jpe.points); + JAndroidPointerEvent jpe = pointer_events.front()->get(); + os_android->process_touch(jpe.what, jpe.pointer, jpe.points); pointer_events.pop_front(); } @@ -1099,10 +1044,9 @@ JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_step(JNIEnv * env, jo if (quit_request) { os_android->main_loop_request_quit(); - quit_request=false; + quit_request = false; } - input_mutex->unlock(); os_android->process_accelerometer(accelerometer); @@ -1111,41 +1055,36 @@ JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_step(JNIEnv * env, jo os_android->process_gyroscope(gyroscope); - if (os_android->main_loop_iterate()==true) { + if (os_android->main_loop_iterate() == true) { jclass cls = env->FindClass("org/godotengine/godot/Godot"); jmethodID _finish = env->GetMethodID(cls, "forceQuit", "()V"); env->CallVoidMethod(_godot_instance, _finish); - __android_log_print(ANDROID_LOG_INFO,"godot","**FINISH REQUEST!!! - %p-%i\n",env,Thread::get_caller_ID()); - + __android_log_print(ANDROID_LOG_INFO, "godot", "**FINISH REQUEST!!! - %p-%i\n", env, Thread::get_caller_ID()); } suspend_mutex->unlock(); - } -JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_touch(JNIEnv * env, jobject obj, jint ev,jint pointer, jint count, jintArray positions) { - - +JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_touch(JNIEnv *env, jobject obj, jint ev, jint pointer, jint count, jintArray positions) { //__android_log_print(ANDROID_LOG_INFO,"godot","**TOUCH EVENT! - %p-%i\n",env,Thread::get_caller_ID()); - Vector<OS_Android::TouchPos> points; - for(int i=0;i<count;i++) { + for (int i = 0; i < count; i++) { jint p[3]; - env->GetIntArrayRegion(positions,i*3,3,p); + env->GetIntArrayRegion(positions, i * 3, 3, p); OS_Android::TouchPos tp; - tp.pos=Point2(p[1],p[2]); - tp.id=p[0]; + tp.pos = Point2(p[1], p[2]); + tp.id = p[0]; points.push_back(tp); } JAndroidPointerEvent jpe; - jpe.pointer=pointer; - jpe.points=points; - jpe.what=ev; + jpe.pointer = pointer; + jpe.points = points; + jpe.what = ev; input_mutex->lock(); @@ -1153,128 +1092,127 @@ JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_touch(JNIEnv * env, j input_mutex->unlock(); //if (os_android) -// os_android->process_touch(ev,pointer,points); - + // os_android->process_touch(ev,pointer,points); } /* * Android Key codes. */ enum { - AKEYCODE_UNKNOWN = 0, - AKEYCODE_SOFT_LEFT = 1, - AKEYCODE_SOFT_RIGHT = 2, - AKEYCODE_HOME = 3, - AKEYCODE_BACK = 4, - AKEYCODE_CALL = 5, - AKEYCODE_ENDCALL = 6, - AKEYCODE_0 = 7, - AKEYCODE_1 = 8, - AKEYCODE_2 = 9, - AKEYCODE_3 = 10, - AKEYCODE_4 = 11, - AKEYCODE_5 = 12, - AKEYCODE_6 = 13, - AKEYCODE_7 = 14, - AKEYCODE_8 = 15, - AKEYCODE_9 = 16, - AKEYCODE_STAR = 17, - AKEYCODE_POUND = 18, - AKEYCODE_DPAD_UP = 19, - AKEYCODE_DPAD_DOWN = 20, - AKEYCODE_DPAD_LEFT = 21, - AKEYCODE_DPAD_RIGHT = 22, - AKEYCODE_DPAD_CENTER = 23, - AKEYCODE_VOLUME_UP = 24, - AKEYCODE_VOLUME_DOWN = 25, - AKEYCODE_POWER = 26, - AKEYCODE_CAMERA = 27, - AKEYCODE_CLEAR = 28, - AKEYCODE_A = 29, - AKEYCODE_B = 30, - AKEYCODE_C = 31, - AKEYCODE_D = 32, - AKEYCODE_E = 33, - AKEYCODE_F = 34, - AKEYCODE_G = 35, - AKEYCODE_H = 36, - AKEYCODE_I = 37, - AKEYCODE_J = 38, - AKEYCODE_K = 39, - AKEYCODE_L = 40, - AKEYCODE_M = 41, - AKEYCODE_N = 42, - AKEYCODE_O = 43, - AKEYCODE_P = 44, - AKEYCODE_Q = 45, - AKEYCODE_R = 46, - AKEYCODE_S = 47, - AKEYCODE_T = 48, - AKEYCODE_U = 49, - AKEYCODE_V = 50, - AKEYCODE_W = 51, - AKEYCODE_X = 52, - AKEYCODE_Y = 53, - AKEYCODE_Z = 54, - AKEYCODE_COMMA = 55, - AKEYCODE_PERIOD = 56, - AKEYCODE_ALT_LEFT = 57, - AKEYCODE_ALT_RIGHT = 58, - AKEYCODE_SHIFT_LEFT = 59, - AKEYCODE_SHIFT_RIGHT = 60, - AKEYCODE_TAB = 61, - AKEYCODE_SPACE = 62, - AKEYCODE_SYM = 63, - AKEYCODE_EXPLORER = 64, - AKEYCODE_ENVELOPE = 65, - AKEYCODE_ENTER = 66, - AKEYCODE_DEL = 67, - AKEYCODE_GRAVE = 68, - AKEYCODE_MINUS = 69, - AKEYCODE_EQUALS = 70, - AKEYCODE_LEFT_BRACKET = 71, - AKEYCODE_RIGHT_BRACKET = 72, - AKEYCODE_BACKSLASH = 73, - AKEYCODE_SEMICOLON = 74, - AKEYCODE_APOSTROPHE = 75, - AKEYCODE_SLASH = 76, - AKEYCODE_AT = 77, - AKEYCODE_NUM = 78, - AKEYCODE_HEADSETHOOK = 79, - AKEYCODE_FOCUS = 80, // *Camera* focus - AKEYCODE_PLUS = 81, - AKEYCODE_MENU = 82, - AKEYCODE_NOTIFICATION = 83, - AKEYCODE_SEARCH = 84, - AKEYCODE_MEDIA_PLAY_PAUSE= 85, - AKEYCODE_MEDIA_STOP = 86, - AKEYCODE_MEDIA_NEXT = 87, - AKEYCODE_MEDIA_PREVIOUS = 88, - AKEYCODE_MEDIA_REWIND = 89, - AKEYCODE_MEDIA_FAST_FORWARD = 90, - AKEYCODE_MUTE = 91, - AKEYCODE_PAGE_UP = 92, - AKEYCODE_PAGE_DOWN = 93, - AKEYCODE_PICTSYMBOLS = 94, - AKEYCODE_SWITCH_CHARSET = 95, - AKEYCODE_BUTTON_A = 96, - AKEYCODE_BUTTON_B = 97, - AKEYCODE_BUTTON_C = 98, - AKEYCODE_BUTTON_X = 99, - AKEYCODE_BUTTON_Y = 100, - AKEYCODE_BUTTON_Z = 101, - AKEYCODE_BUTTON_L1 = 102, - AKEYCODE_BUTTON_R1 = 103, - AKEYCODE_BUTTON_L2 = 104, - AKEYCODE_BUTTON_R2 = 105, - AKEYCODE_BUTTON_THUMBL = 106, - AKEYCODE_BUTTON_THUMBR = 107, - AKEYCODE_BUTTON_START = 108, - AKEYCODE_BUTTON_SELECT = 109, - AKEYCODE_BUTTON_MODE = 110, + AKEYCODE_UNKNOWN = 0, + AKEYCODE_SOFT_LEFT = 1, + AKEYCODE_SOFT_RIGHT = 2, + AKEYCODE_HOME = 3, + AKEYCODE_BACK = 4, + AKEYCODE_CALL = 5, + AKEYCODE_ENDCALL = 6, + AKEYCODE_0 = 7, + AKEYCODE_1 = 8, + AKEYCODE_2 = 9, + AKEYCODE_3 = 10, + AKEYCODE_4 = 11, + AKEYCODE_5 = 12, + AKEYCODE_6 = 13, + AKEYCODE_7 = 14, + AKEYCODE_8 = 15, + AKEYCODE_9 = 16, + AKEYCODE_STAR = 17, + AKEYCODE_POUND = 18, + AKEYCODE_DPAD_UP = 19, + AKEYCODE_DPAD_DOWN = 20, + AKEYCODE_DPAD_LEFT = 21, + AKEYCODE_DPAD_RIGHT = 22, + AKEYCODE_DPAD_CENTER = 23, + AKEYCODE_VOLUME_UP = 24, + AKEYCODE_VOLUME_DOWN = 25, + AKEYCODE_POWER = 26, + AKEYCODE_CAMERA = 27, + AKEYCODE_CLEAR = 28, + AKEYCODE_A = 29, + AKEYCODE_B = 30, + AKEYCODE_C = 31, + AKEYCODE_D = 32, + AKEYCODE_E = 33, + AKEYCODE_F = 34, + AKEYCODE_G = 35, + AKEYCODE_H = 36, + AKEYCODE_I = 37, + AKEYCODE_J = 38, + AKEYCODE_K = 39, + AKEYCODE_L = 40, + AKEYCODE_M = 41, + AKEYCODE_N = 42, + AKEYCODE_O = 43, + AKEYCODE_P = 44, + AKEYCODE_Q = 45, + AKEYCODE_R = 46, + AKEYCODE_S = 47, + AKEYCODE_T = 48, + AKEYCODE_U = 49, + AKEYCODE_V = 50, + AKEYCODE_W = 51, + AKEYCODE_X = 52, + AKEYCODE_Y = 53, + AKEYCODE_Z = 54, + AKEYCODE_COMMA = 55, + AKEYCODE_PERIOD = 56, + AKEYCODE_ALT_LEFT = 57, + AKEYCODE_ALT_RIGHT = 58, + AKEYCODE_SHIFT_LEFT = 59, + AKEYCODE_SHIFT_RIGHT = 60, + AKEYCODE_TAB = 61, + AKEYCODE_SPACE = 62, + AKEYCODE_SYM = 63, + AKEYCODE_EXPLORER = 64, + AKEYCODE_ENVELOPE = 65, + AKEYCODE_ENTER = 66, + AKEYCODE_DEL = 67, + AKEYCODE_GRAVE = 68, + AKEYCODE_MINUS = 69, + AKEYCODE_EQUALS = 70, + AKEYCODE_LEFT_BRACKET = 71, + AKEYCODE_RIGHT_BRACKET = 72, + AKEYCODE_BACKSLASH = 73, + AKEYCODE_SEMICOLON = 74, + AKEYCODE_APOSTROPHE = 75, + AKEYCODE_SLASH = 76, + AKEYCODE_AT = 77, + AKEYCODE_NUM = 78, + AKEYCODE_HEADSETHOOK = 79, + AKEYCODE_FOCUS = 80, // *Camera* focus + AKEYCODE_PLUS = 81, + AKEYCODE_MENU = 82, + AKEYCODE_NOTIFICATION = 83, + AKEYCODE_SEARCH = 84, + AKEYCODE_MEDIA_PLAY_PAUSE = 85, + AKEYCODE_MEDIA_STOP = 86, + AKEYCODE_MEDIA_NEXT = 87, + AKEYCODE_MEDIA_PREVIOUS = 88, + AKEYCODE_MEDIA_REWIND = 89, + AKEYCODE_MEDIA_FAST_FORWARD = 90, + AKEYCODE_MUTE = 91, + AKEYCODE_PAGE_UP = 92, + AKEYCODE_PAGE_DOWN = 93, + AKEYCODE_PICTSYMBOLS = 94, + AKEYCODE_SWITCH_CHARSET = 95, + AKEYCODE_BUTTON_A = 96, + AKEYCODE_BUTTON_B = 97, + AKEYCODE_BUTTON_C = 98, + AKEYCODE_BUTTON_X = 99, + AKEYCODE_BUTTON_Y = 100, + AKEYCODE_BUTTON_Z = 101, + AKEYCODE_BUTTON_L1 = 102, + AKEYCODE_BUTTON_R1 = 103, + AKEYCODE_BUTTON_L2 = 104, + AKEYCODE_BUTTON_R2 = 105, + AKEYCODE_BUTTON_THUMBL = 106, + AKEYCODE_BUTTON_THUMBR = 107, + AKEYCODE_BUTTON_START = 108, + AKEYCODE_BUTTON_SELECT = 109, + AKEYCODE_BUTTON_MODE = 110, - // NOTE: If you add a new keycode here you must also add it to several other files. - // Refer to frameworks/base/core/java/android/view/KeyEvent.java for the full list. + // NOTE: If you add a new keycode here you must also add it to several other files. + // Refer to frameworks/base/core/java/android/view/KeyEvent.java for the full list. }; struct _WinTranslatePair { @@ -1283,96 +1221,96 @@ struct _WinTranslatePair { unsigned int keycode; }; - -static _WinTranslatePair _ak_to_keycode[]={ -{ KEY_TAB, AKEYCODE_TAB }, -{ KEY_ENTER, AKEYCODE_ENTER }, -{ KEY_SHIFT, AKEYCODE_SHIFT_LEFT }, -{ KEY_SHIFT, AKEYCODE_SHIFT_RIGHT }, -{ KEY_ALT, AKEYCODE_ALT_LEFT }, -{ KEY_ALT, AKEYCODE_ALT_RIGHT }, -{ KEY_MENU, AKEYCODE_MENU }, -{ KEY_PAUSE, AKEYCODE_MEDIA_PLAY_PAUSE }, -{ KEY_ESCAPE, AKEYCODE_BACK }, -{ KEY_SPACE, AKEYCODE_SPACE }, -{ KEY_PAGEUP, AKEYCODE_PAGE_UP }, -{ KEY_PAGEDOWN, AKEYCODE_PAGE_DOWN }, -{ KEY_HOME, AKEYCODE_HOME },//(0x24) -{ KEY_LEFT, AKEYCODE_DPAD_LEFT }, -{ KEY_UP, AKEYCODE_DPAD_UP }, -{ KEY_RIGHT, AKEYCODE_DPAD_RIGHT }, -{ KEY_DOWN, AKEYCODE_DPAD_DOWN}, -{ KEY_PERIODCENTERED, AKEYCODE_DPAD_CENTER }, -{ KEY_BACKSPACE, AKEYCODE_DEL}, -{ KEY_0, AKEYCODE_0 },////0 key -{ KEY_1, AKEYCODE_1 },////1 key -{ KEY_2, AKEYCODE_2 },////2 key -{ KEY_3, AKEYCODE_3 },////3 key -{ KEY_4, AKEYCODE_4 },////4 key -{ KEY_5, AKEYCODE_5 },////5 key -{ KEY_6, AKEYCODE_6 },////6 key -{ KEY_7, AKEYCODE_7 },////7 key -{ KEY_8, AKEYCODE_8 },////8 key -{ KEY_9, AKEYCODE_9 },////9 key -{ KEY_A, AKEYCODE_A },////A key -{ KEY_B, AKEYCODE_B },////B key -{ KEY_C, AKEYCODE_C },////C key -{ KEY_D, AKEYCODE_D },////D key -{ KEY_E, AKEYCODE_E },////E key -{ KEY_F, AKEYCODE_F },////F key -{ KEY_G, AKEYCODE_G },////G key -{ KEY_H, AKEYCODE_H },////H key -{ KEY_I, AKEYCODE_I },////I key -{ KEY_J, AKEYCODE_J },////J key -{ KEY_K, AKEYCODE_K },////K key -{ KEY_L, AKEYCODE_L },////L key -{ KEY_M, AKEYCODE_M },////M key -{ KEY_N, AKEYCODE_N },////N key -{ KEY_O, AKEYCODE_O },////O key -{ KEY_P, AKEYCODE_P },////P key -{ KEY_Q, AKEYCODE_Q },////Q key -{ KEY_R, AKEYCODE_R },////R key -{ KEY_S, AKEYCODE_S },////S key -{ KEY_T, AKEYCODE_T },////T key -{ KEY_U, AKEYCODE_U },////U key -{ KEY_V, AKEYCODE_V },////V key -{ KEY_W, AKEYCODE_W },////W key -{ KEY_X, AKEYCODE_X },////X key -{ KEY_Y, AKEYCODE_Y },////Y key -{ KEY_Z, AKEYCODE_Z },////Z key -{ KEY_HOMEPAGE, AKEYCODE_EXPLORER}, -{ KEY_LAUNCH0, AKEYCODE_BUTTON_A}, -{ KEY_LAUNCH1, AKEYCODE_BUTTON_B}, -{ KEY_LAUNCH2, AKEYCODE_BUTTON_C}, -{ KEY_LAUNCH3, AKEYCODE_BUTTON_X}, -{ KEY_LAUNCH4, AKEYCODE_BUTTON_Y}, -{ KEY_LAUNCH5, AKEYCODE_BUTTON_Z}, -{ KEY_LAUNCH6, AKEYCODE_BUTTON_L1}, -{ KEY_LAUNCH7, AKEYCODE_BUTTON_R1}, -{ KEY_LAUNCH8, AKEYCODE_BUTTON_L2}, -{ KEY_LAUNCH9, AKEYCODE_BUTTON_R2}, -{ KEY_LAUNCHA, AKEYCODE_BUTTON_THUMBL}, -{ KEY_LAUNCHB, AKEYCODE_BUTTON_THUMBR}, -{ KEY_LAUNCHC, AKEYCODE_BUTTON_START}, -{ KEY_LAUNCHD, AKEYCODE_BUTTON_SELECT}, -{ KEY_LAUNCHE, AKEYCODE_BUTTON_MODE}, -{ KEY_VOLUMEMUTE, AKEYCODE_MUTE}, -{ KEY_VOLUMEDOWN, AKEYCODE_VOLUME_DOWN}, -{ KEY_VOLUMEUP, AKEYCODE_VOLUME_UP}, -{ KEY_BACK, AKEYCODE_MEDIA_REWIND }, -{ KEY_FORWARD, AKEYCODE_MEDIA_FAST_FORWARD }, -{ KEY_MEDIANEXT, AKEYCODE_MEDIA_NEXT }, -{ KEY_MEDIAPREVIOUS, AKEYCODE_MEDIA_PREVIOUS }, -{ KEY_MEDIASTOP, AKEYCODE_MEDIA_STOP }, -{ KEY_PLUS, AKEYCODE_PLUS }, -{ KEY_EQUAL, AKEYCODE_EQUALS},// the '+' key -{ KEY_COMMA, AKEYCODE_COMMA},// the ',' key -{ KEY_MINUS, AKEYCODE_MINUS},// the '-' key -{ KEY_SLASH, AKEYCODE_SLASH},// the '/?' key -{ KEY_BACKSLASH, AKEYCODE_BACKSLASH}, -{ KEY_BRACKETLEFT, AKEYCODE_LEFT_BRACKET}, -{ KEY_BRACKETRIGHT, AKEYCODE_RIGHT_BRACKET}, -{ KEY_UNKNOWN, 0} }; +static _WinTranslatePair _ak_to_keycode[] = { + { KEY_TAB, AKEYCODE_TAB }, + { KEY_ENTER, AKEYCODE_ENTER }, + { KEY_SHIFT, AKEYCODE_SHIFT_LEFT }, + { KEY_SHIFT, AKEYCODE_SHIFT_RIGHT }, + { KEY_ALT, AKEYCODE_ALT_LEFT }, + { KEY_ALT, AKEYCODE_ALT_RIGHT }, + { KEY_MENU, AKEYCODE_MENU }, + { KEY_PAUSE, AKEYCODE_MEDIA_PLAY_PAUSE }, + { KEY_ESCAPE, AKEYCODE_BACK }, + { KEY_SPACE, AKEYCODE_SPACE }, + { KEY_PAGEUP, AKEYCODE_PAGE_UP }, + { KEY_PAGEDOWN, AKEYCODE_PAGE_DOWN }, + { KEY_HOME, AKEYCODE_HOME }, //(0x24) + { KEY_LEFT, AKEYCODE_DPAD_LEFT }, + { KEY_UP, AKEYCODE_DPAD_UP }, + { KEY_RIGHT, AKEYCODE_DPAD_RIGHT }, + { KEY_DOWN, AKEYCODE_DPAD_DOWN }, + { KEY_PERIODCENTERED, AKEYCODE_DPAD_CENTER }, + { KEY_BACKSPACE, AKEYCODE_DEL }, + { KEY_0, AKEYCODE_0 }, ////0 key + { KEY_1, AKEYCODE_1 }, ////1 key + { KEY_2, AKEYCODE_2 }, ////2 key + { KEY_3, AKEYCODE_3 }, ////3 key + { KEY_4, AKEYCODE_4 }, ////4 key + { KEY_5, AKEYCODE_5 }, ////5 key + { KEY_6, AKEYCODE_6 }, ////6 key + { KEY_7, AKEYCODE_7 }, ////7 key + { KEY_8, AKEYCODE_8 }, ////8 key + { KEY_9, AKEYCODE_9 }, ////9 key + { KEY_A, AKEYCODE_A }, ////A key + { KEY_B, AKEYCODE_B }, ////B key + { KEY_C, AKEYCODE_C }, ////C key + { KEY_D, AKEYCODE_D }, ////D key + { KEY_E, AKEYCODE_E }, ////E key + { KEY_F, AKEYCODE_F }, ////F key + { KEY_G, AKEYCODE_G }, ////G key + { KEY_H, AKEYCODE_H }, ////H key + { KEY_I, AKEYCODE_I }, ////I key + { KEY_J, AKEYCODE_J }, ////J key + { KEY_K, AKEYCODE_K }, ////K key + { KEY_L, AKEYCODE_L }, ////L key + { KEY_M, AKEYCODE_M }, ////M key + { KEY_N, AKEYCODE_N }, ////N key + { KEY_O, AKEYCODE_O }, ////O key + { KEY_P, AKEYCODE_P }, ////P key + { KEY_Q, AKEYCODE_Q }, ////Q key + { KEY_R, AKEYCODE_R }, ////R key + { KEY_S, AKEYCODE_S }, ////S key + { KEY_T, AKEYCODE_T }, ////T key + { KEY_U, AKEYCODE_U }, ////U key + { KEY_V, AKEYCODE_V }, ////V key + { KEY_W, AKEYCODE_W }, ////W key + { KEY_X, AKEYCODE_X }, ////X key + { KEY_Y, AKEYCODE_Y }, ////Y key + { KEY_Z, AKEYCODE_Z }, ////Z key + { KEY_HOMEPAGE, AKEYCODE_EXPLORER }, + { KEY_LAUNCH0, AKEYCODE_BUTTON_A }, + { KEY_LAUNCH1, AKEYCODE_BUTTON_B }, + { KEY_LAUNCH2, AKEYCODE_BUTTON_C }, + { KEY_LAUNCH3, AKEYCODE_BUTTON_X }, + { KEY_LAUNCH4, AKEYCODE_BUTTON_Y }, + { KEY_LAUNCH5, AKEYCODE_BUTTON_Z }, + { KEY_LAUNCH6, AKEYCODE_BUTTON_L1 }, + { KEY_LAUNCH7, AKEYCODE_BUTTON_R1 }, + { KEY_LAUNCH8, AKEYCODE_BUTTON_L2 }, + { KEY_LAUNCH9, AKEYCODE_BUTTON_R2 }, + { KEY_LAUNCHA, AKEYCODE_BUTTON_THUMBL }, + { KEY_LAUNCHB, AKEYCODE_BUTTON_THUMBR }, + { KEY_LAUNCHC, AKEYCODE_BUTTON_START }, + { KEY_LAUNCHD, AKEYCODE_BUTTON_SELECT }, + { KEY_LAUNCHE, AKEYCODE_BUTTON_MODE }, + { KEY_VOLUMEMUTE, AKEYCODE_MUTE }, + { KEY_VOLUMEDOWN, AKEYCODE_VOLUME_DOWN }, + { KEY_VOLUMEUP, AKEYCODE_VOLUME_UP }, + { KEY_BACK, AKEYCODE_MEDIA_REWIND }, + { KEY_FORWARD, AKEYCODE_MEDIA_FAST_FORWARD }, + { KEY_MEDIANEXT, AKEYCODE_MEDIA_NEXT }, + { KEY_MEDIAPREVIOUS, AKEYCODE_MEDIA_PREVIOUS }, + { KEY_MEDIASTOP, AKEYCODE_MEDIA_STOP }, + { KEY_PLUS, AKEYCODE_PLUS }, + { KEY_EQUAL, AKEYCODE_EQUALS }, // the '+' key + { KEY_COMMA, AKEYCODE_COMMA }, // the ',' key + { KEY_MINUS, AKEYCODE_MINUS }, // the '-' key + { KEY_SLASH, AKEYCODE_SLASH }, // the '/?' key + { KEY_BACKSLASH, AKEYCODE_BACKSLASH }, + { KEY_BRACKETLEFT, AKEYCODE_LEFT_BRACKET }, + { KEY_BRACKETRIGHT, AKEYCODE_RIGHT_BRACKET }, + { KEY_UNKNOWN, 0 } +}; /* TODO: map these android key: AKEYCODE_SOFT_LEFT = 1, @@ -1400,20 +1338,19 @@ TODO: map these android key: */ static unsigned int android_get_keysym(unsigned int p_code) { - for(int i=0;_ak_to_keycode[i].keysym!=KEY_UNKNOWN;i++) { + for (int i = 0; _ak_to_keycode[i].keysym != KEY_UNKNOWN; i++) { - if (_ak_to_keycode[i].keycode==p_code) { + if (_ak_to_keycode[i].keycode == p_code) { //print_line("outcode: " + _ak_to_keycode[i].keysym); return _ak_to_keycode[i].keysym; } } - return KEY_UNKNOWN; } -JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_joybutton(JNIEnv * env, jobject obj, jint p_device, jint p_button, jboolean p_pressed) { +JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_joybutton(JNIEnv *env, jobject obj, jint p_device, jint p_button, jboolean p_pressed) { OS_Android::JoystickEvent jevent; jevent.device = p_device; @@ -1426,7 +1363,7 @@ JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_joybutton(JNIEnv * en input_mutex->unlock(); } -JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_joyaxis(JNIEnv * env, jobject obj, jint p_device, jint p_axis, jfloat p_value) { +JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_joyaxis(JNIEnv *env, jobject obj, jint p_device, jint p_axis, jfloat p_value) { OS_Android::JoystickEvent jevent; jevent.device = p_device; @@ -1439,18 +1376,22 @@ JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_joyaxis(JNIEnv * env, input_mutex->unlock(); } -JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_joyhat(JNIEnv * env, jobject obj, jint p_device, jint p_hat_x, jint p_hat_y) { +JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_joyhat(JNIEnv *env, jobject obj, jint p_device, jint p_hat_x, jint p_hat_y) { OS_Android::JoystickEvent jevent; jevent.device = p_device; jevent.type = OS_Android::JOY_EVENT_HAT; int hat = 0; if (p_hat_x != 0) { - if (p_hat_x < 0) hat |= InputDefault::HAT_MASK_LEFT; - else hat |= InputDefault::HAT_MASK_RIGHT; + if (p_hat_x < 0) + hat |= InputDefault::HAT_MASK_LEFT; + else + hat |= InputDefault::HAT_MASK_RIGHT; } if (p_hat_y != 0) { - if (p_hat_y < 0) hat |= InputDefault::HAT_MASK_UP; - else hat |= InputDefault::HAT_MASK_DOWN; + if (p_hat_y < 0) + hat |= InputDefault::HAT_MASK_UP; + else + hat |= InputDefault::HAT_MASK_DOWN; } jevent.hat = hat; input_mutex->lock(); @@ -1458,14 +1399,14 @@ JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_joyhat(JNIEnv * env, input_mutex->unlock(); } -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) { - String name = env->GetStringUTFChars( p_name, NULL ); + String name = env->GetStringUTFChars(p_name, NULL); os_android->joy_connection_changed(p_device, p_connected, name); } } -JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_key(JNIEnv * env, jobject obj, jint p_scancode, jint p_unicode_char, jboolean p_pressed) { +JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_key(JNIEnv *env, jobject obj, jint p_scancode, jint p_unicode_char, jboolean p_pressed) { InputEvent ievent; ievent.type = InputEvent::KEY; @@ -1478,56 +1419,51 @@ JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_key(JNIEnv * env, job print_line("Scancode: " + String::num(p_scancode) + ":" + String::num(ievent.key.scancode) + " Unicode: " + String::num(val)); - ievent.key.mod.shift=false; - ievent.key.mod.alt=false; - ievent.key.mod.control=false; - ievent.key.echo=false; + ievent.key.mod.shift = false; + ievent.key.mod.alt = false; + ievent.key.mod.control = false; + ievent.key.echo = false; - if (val == '\n') - { + if (val == '\n') { ievent.key.scancode = KEY_ENTER; - }else if (val == 61448) { + } else if (val == 61448) { ievent.key.scancode = KEY_BACKSPACE; ievent.key.unicode = KEY_BACKSPACE; } else if (val == 61453) { ievent.key.scancode = KEY_ENTER; ievent.key.unicode = KEY_ENTER; - } else if (p_scancode==4) { + } else if (p_scancode == 4) { - quit_request=true; - } + quit_request = true; + } input_mutex->lock(); key_events.push_back(ievent); input_mutex->unlock(); } - -JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_accelerometer(JNIEnv * env, jobject obj, jfloat x, jfloat y, jfloat z) { +JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_accelerometer(JNIEnv *env, jobject obj, jfloat x, jfloat y, jfloat z) { input_mutex->lock(); - accelerometer=Vector3(x,y,z); + accelerometer = Vector3(x, y, z); input_mutex->unlock(); - } -JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_magnetometer(JNIEnv * env, jobject obj, jfloat x, jfloat y, jfloat z) { +JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_magnetometer(JNIEnv *env, jobject obj, jfloat x, jfloat y, jfloat z) { input_mutex->lock(); - magnetometer=Vector3(x,y,z); + magnetometer = Vector3(x, y, z); input_mutex->unlock(); - } -JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_gyroscope(JNIEnv * env, jobject obj, jfloat x, jfloat y, jfloat z) { +JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_gyroscope(JNIEnv *env, jobject obj, jfloat x, jfloat y, jfloat z) { input_mutex->lock(); - gyroscope=Vector3(x,y,z); + gyroscope = Vector3(x, y, z); input_mutex->unlock(); - } -JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_focusin(JNIEnv * env, jobject obj){ +JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_focusin(JNIEnv *env, jobject obj) { if (!suspend_mutex) return; @@ -1539,7 +1475,7 @@ JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_focusin(JNIEnv * env, suspend_mutex->unlock(); } -JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_focusout(JNIEnv * env, jobject obj){ +JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_focusout(JNIEnv *env, jobject obj) { if (!suspend_mutex) return; @@ -1549,58 +1485,50 @@ JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_focusout(JNIEnv * env os_android->main_loop_focusout(); suspend_mutex->unlock(); - } - - -JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_audio(JNIEnv * env, jobject obj) { +JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_audio(JNIEnv *env, jobject obj) { ThreadAndroid::setup_thread(); AudioDriverAndroid::thread_func(env); - - } +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 ); - JNISingleton *s = memnew( JNISingleton ); + String singname = env->GetStringUTFChars(name, NULL); + JNISingleton *s = memnew(JNISingleton); s->set_instance(env->NewGlobalRef(p_object)); - jni_singletons[singname]=s; - - Globals::get_singleton()->add_singleton(Globals::Singleton(singname,s)); - Globals::get_singleton()->set(singname,s); + jni_singletons[singname] = s; + Globals::get_singleton()->add_singleton(Globals::Singleton(singname, s)); + Globals::get_singleton()->set(singname, s); } - -static Variant::Type get_jni_type(const String& p_type) { +static Variant::Type get_jni_type(const String &p_type) { static struct { const char *name; Variant::Type type; - } _type_to_vtype[]={ - {"void",Variant::NIL}, - {"boolean",Variant::BOOL}, - {"int",Variant::INT}, - {"float",Variant::REAL}, - {"double", Variant::REAL}, - {"java.lang.String",Variant::STRING}, - {"[I",Variant::INT_ARRAY}, - {"[B",Variant::RAW_ARRAY}, - {"[F",Variant::REAL_ARRAY}, - {"[Ljava.lang.String;",Variant::STRING_ARRAY}, - {"org.godotengine.godot.Dictionary", Variant::DICTIONARY}, - {NULL,Variant::NIL} + } _type_to_vtype[] = { + { "void", Variant::NIL }, + { "boolean", Variant::BOOL }, + { "int", Variant::INT }, + { "float", Variant::REAL }, + { "double", Variant::REAL }, + { "java.lang.String", Variant::STRING }, + { "[I", Variant::INT_ARRAY }, + { "[B", Variant::RAW_ARRAY }, + { "[F", Variant::REAL_ARRAY }, + { "[Ljava.lang.String;", Variant::STRING_ARRAY }, + { "org.godotengine.godot.Dictionary", Variant::DICTIONARY }, + { NULL, Variant::NIL } }; - int idx=0; + int idx = 0; while (_type_to_vtype[idx].name) { - if (p_type==_type_to_vtype[idx].name) + if (p_type == _type_to_vtype[idx].name) return _type_to_vtype[idx].type; idx++; @@ -1609,161 +1537,143 @@ static Variant::Type get_jni_type(const String& p_type) { return Variant::NIL; } - -static const char* get_jni_sig(const String& p_type) { - +static const char *get_jni_sig(const String &p_type) { static struct { const char *name; const char *sig; - } _type_to_vtype[]={ - {"void","V"}, - {"boolean","Z"}, - {"int","I"}, - {"float","F"}, - {"double","D"}, - {"java.lang.String","Ljava/lang/String;"}, - {"org.godotengine.godot.Dictionary", "Lorg/godotengine/godot/Dictionary;"}, - {"[I","[I"}, - {"[B","[B"}, - {"[F","[F"}, - {"[Ljava.lang.String;","[Ljava/lang/String;"}, - {NULL,"V"} + } _type_to_vtype[] = { + { "void", "V" }, + { "boolean", "Z" }, + { "int", "I" }, + { "float", "F" }, + { "double", "D" }, + { "java.lang.String", "Ljava/lang/String;" }, + { "org.godotengine.godot.Dictionary", "Lorg/godotengine/godot/Dictionary;" }, + { "[I", "[I" }, + { "[B", "[B" }, + { "[F", "[F" }, + { "[Ljava.lang.String;", "[Ljava/lang/String;" }, + { NULL, "V" } }; - int idx=0; + int idx = 0; while (_type_to_vtype[idx].name) { - if (p_type==_type_to_vtype[idx].name) + if (p_type == _type_to_vtype[idx].name) return _type_to_vtype[idx].sig; idx++; } - return "Ljava/lang/Object;"; } -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 = env->GetStringUTFChars(path, NULL); return env->NewStringUTF(Globals::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 = env->GetStringUTFChars(sname, NULL); ERR_FAIL_COND(!jni_singletons.has(singname)); JNISingleton *s = jni_singletons.get(singname); - - String mname = env->GetStringUTFChars( name, NULL ); - String retval = env->GetStringUTFChars( ret, NULL ); + String mname = env->GetStringUTFChars(name, NULL); + String retval = env->GetStringUTFChars(ret, NULL); Vector<Variant::Type> types; - String cs="("; - + String cs = "("; int stringCount = env->GetArrayLength(args); - print_line("Singl: "+singname+" Method: "+mname+" RetVal: "+retval); - for (int i=0; i<stringCount; i++) { + print_line("Singl: " + singname + " Method: " + mname + " RetVal: " + retval); + 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)); + cs += get_jni_sig(String(rawString)); } - cs+=")"; - cs+=get_jni_sig(retval); + cs += ")"; + cs += get_jni_sig(retval); jclass cls = env->GetObjectClass(s->get_instance()); - print_line("METHOD: "+mname+" sig: "+cs); + print_line("METHOD: " + mname + " sig: " + cs); jmethodID mid = env->GetMethodID(cls, mname.ascii().get_data(), cs.ascii().get_data()); if (!mid) { - print_line("FAILED GETTING METHOID "+mname); + print_line("FAILED GETTING METHOID " + mname); } - s->add_method(mname,mid,types,get_jni_type(retval)); - - + s->add_method(mname, mid, types, get_jni_type(retval)); } -JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_callobject(JNIEnv * env, jobject p_obj, jint ID, jstring method, jobjectArray params) { +JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_callobject(JNIEnv *env, jobject p_obj, jint ID, jstring method, jobjectArray params) { - Object* obj = ObjectDB::get_instance(ID); + Object *obj = ObjectDB::get_instance(ID); ERR_FAIL_COND(!obj); int res = env->PushLocalFrame(16); - ERR_FAIL_COND(res!=0); - - String str_method = env->GetStringUTFChars( method, NULL ); + ERR_FAIL_COND(res != 0); + String str_method = env->GetStringUTFChars(method, NULL); int count = env->GetArrayLength(params); - Variant* vlist = (Variant*)alloca(sizeof(Variant) * count); - Variant** vptr = (Variant**)alloca(sizeof(Variant*) * count); - for (int i=0; i<count; i++) { + Variant *vlist = (Variant *)alloca(sizeof(Variant) * count); + Variant **vptr = (Variant **)alloca(sizeof(Variant *) * count); + for (int i = 0; i < count; i++) { jobject obj = env->GetObjectArrayElement(params, i); Variant v; if (obj) - v=_jobject_to_variant(env, obj); + v = _jobject_to_variant(env, obj); memnew_placement(&vlist[i], Variant); vlist[i] = v; vptr[i] = &vlist[i]; env->DeleteLocalRef(obj); - }; Variant::CallError err; - obj->call(str_method, (const Variant**)vptr, count, err); + obj->call(str_method, (const Variant **)vptr, count, err); // something env->PopLocalFrame(NULL); - } -JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_calldeferred(JNIEnv * env, jobject p_obj, jint ID, jstring method, jobjectArray params) { - +JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_calldeferred(JNIEnv *env, jobject p_obj, jint ID, jstring method, jobjectArray params) { - Object* obj = ObjectDB::get_instance(ID); + Object *obj = ObjectDB::get_instance(ID); ERR_FAIL_COND(!obj); 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 = env->GetStringUTFChars(method, NULL); int count = env->GetArrayLength(params); Variant args[VARIANT_ARG_MAX]; - //print_line("Java->GD call: "+obj->get_type()+"::"+str_method+" argc "+itos(count)); + //print_line("Java->GD call: "+obj->get_type()+"::"+str_method+" argc "+itos(count)); - for (int i=0; i<MIN(count,VARIANT_ARG_MAX); i++) { + for (int i = 0; i < MIN(count, VARIANT_ARG_MAX); i++) { jobject obj = env->GetObjectArrayElement(params, i); if (obj) args[i] = _jobject_to_variant(env, obj); env->DeleteLocalRef(obj); -// print_line("\targ"+itos(i)+": "+Variant::get_type_name(args[i].get_type())); - + // 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]); + obj->call_deferred(str_method, args[0], args[1], args[2], args[3], args[4]); // something env->PopLocalFrame(NULL); - } //Main::cleanup(); diff --git a/platform/android/java_glue.h b/platform/android/java_glue.h index bc4628b9d..51a203186 100644 --- a/platform/android/java_glue.h +++ b/platform/android/java_glue.h @@ -31,35 +31,33 @@ #ifndef JAVA_GLUE_H #define JAVA_GLUE_H -#include <jni.h> #include <android/log.h> - +#include <jni.h> extern "C" { - JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_initialize(JNIEnv * env, jobject obj, jobject activity,jboolean p_need_reload_hook, jobjectArray p_cmdline,jobject p_asset_manager); - JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_resize(JNIEnv * env, jobject obj, jint width, jint height, jboolean reload); - JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_newcontext(JNIEnv * env, jobject obj, bool p_32_bits); - JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_step(JNIEnv * env, jobject obj); - JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_quit(JNIEnv * env, jobject obj); - JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_touch(JNIEnv * env, jobject obj, jint ev,jint pointer, jint count, jintArray positions); - JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_key(JNIEnv * env, jobject obj, jint p_scancode, jint p_unicode_char, jboolean p_pressed); - JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_joybutton(JNIEnv * env, jobject obj, jint p_device, jint p_button, jboolean p_pressed); - JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_joyaxis(JNIEnv * env, jobject obj, jint p_device, jint p_axis, jfloat p_value); - JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_joyhat(JNIEnv * env, jobject obj, jint p_device, jint p_hat_x, jint p_hat_y); - 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_audio(JNIEnv * env, jobject obj); - JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_accelerometer(JNIEnv * env, jobject obj, jfloat x, jfloat y, jfloat z); - JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_magnetometer(JNIEnv * env, jobject obj, jfloat x, jfloat y, jfloat z); - JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_gyroscope(JNIEnv * env, jobject obj, jfloat x, jfloat y, jfloat z); - JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_focusin(JNIEnv * env, jobject obj); - JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_focusout(JNIEnv * env, jobject obj); - 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_method(JNIEnv * env, jobject obj, jstring sname, jstring name, jstring ret, jobjectArray args); - JNIEXPORT jstring JNICALL Java_org_godotengine_godot_GodotLib_getGlobal(JNIEnv * env, jobject obj, jstring path); - JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_callobject(JNIEnv * env, jobject obj, jint ID, jstring method, jobjectArray params); - JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_calldeferred(JNIEnv * env, jobject obj, jint ID, jstring method, jobjectArray params); +JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_initialize(JNIEnv *env, jobject obj, jobject activity, jboolean p_need_reload_hook, jobjectArray p_cmdline, jobject p_asset_manager); +JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_resize(JNIEnv *env, jobject obj, jint width, jint height, jboolean reload); +JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_newcontext(JNIEnv *env, jobject obj, bool p_32_bits); +JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_step(JNIEnv *env, jobject obj); +JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_quit(JNIEnv *env, jobject obj); +JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_touch(JNIEnv *env, jobject obj, jint ev, jint pointer, jint count, jintArray positions); +JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_key(JNIEnv *env, jobject obj, jint p_scancode, jint p_unicode_char, jboolean p_pressed); +JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_joybutton(JNIEnv *env, jobject obj, jint p_device, jint p_button, jboolean p_pressed); +JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_joyaxis(JNIEnv *env, jobject obj, jint p_device, jint p_axis, jfloat p_value); +JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_joyhat(JNIEnv *env, jobject obj, jint p_device, jint p_hat_x, jint p_hat_y); +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_audio(JNIEnv *env, jobject obj); +JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_accelerometer(JNIEnv *env, jobject obj, jfloat x, jfloat y, jfloat z); +JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_magnetometer(JNIEnv *env, jobject obj, jfloat x, jfloat y, jfloat z); +JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_gyroscope(JNIEnv *env, jobject obj, jfloat x, jfloat y, jfloat z); +JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_focusin(JNIEnv *env, jobject obj); +JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_focusout(JNIEnv *env, jobject obj); +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_method(JNIEnv *env, jobject obj, jstring sname, jstring name, jstring ret, jobjectArray args); +JNIEXPORT jstring JNICALL Java_org_godotengine_godot_GodotLib_getGlobal(JNIEnv *env, jobject obj, jstring path); +JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_callobject(JNIEnv *env, jobject obj, jint ID, jstring method, jobjectArray params); +JNIEXPORT void JNICALL Java_org_godotengine_godot_GodotLib_calldeferred(JNIEnv *env, jobject obj, jint ID, jstring method, jobjectArray params); } - #endif #endif // JAVA_GLUE_H diff --git a/platform/android/os_android.cpp b/platform/android/os_android.cpp index 54af4cde1..3f80636c5 100644 --- a/platform/android/os_android.cpp +++ b/platform/android/os_android.cpp @@ -30,23 +30,23 @@ #include "drivers/gles2/rasterizer_gles2.h" #include "core/io/file_access_buffered_fa.h" -#include "drivers/unix/file_access_unix.h" #include "drivers/unix/dir_access_unix.h" +#include "drivers/unix/file_access_unix.h" +#include "main/main.h" #include "servers/visual/visual_server_raster.h" #include "servers/visual/visual_server_wrap_mt.h" -#include "main/main.h" #include "file_access_android.h" #include "core/globals.h" #ifdef ANDROID_NATIVE_ACTIVITY -#include "file_access_android.h" #include "dir_access_android.h" +#include "file_access_android.h" #else -#include "file_access_jandroid.h" #include "dir_access_jandroid.h" +#include "file_access_jandroid.h" #endif int OS_Android::get_video_driver_count() const { @@ -54,7 +54,7 @@ int OS_Android::get_video_driver_count() const { return 1; } -const char * OS_Android::get_video_driver_name(int p_driver) const { +const char *OS_Android::get_video_driver_name(int p_driver) const { return "GLES2"; } @@ -69,7 +69,7 @@ int OS_Android::get_audio_driver_count() const { return 1; } -const char * OS_Android::get_audio_driver_name(int p_driver) const { +const char *OS_Android::get_audio_driver_name(int p_driver) const { return "Android"; } @@ -111,35 +111,31 @@ void OS_Android::initialize_core() { DirAccess::make_default<DirAccessUnix>(DirAccess::ACCESS_FILESYSTEM); #endif - } -void OS_Android::set_opengl_extensions(const char* p_gl_extensions) { +void OS_Android::set_opengl_extensions(const char *p_gl_extensions) { ERR_FAIL_COND(!p_gl_extensions); - gl_extensions=p_gl_extensions; + gl_extensions = p_gl_extensions; } -void OS_Android::initialize(const VideoMode& p_desired,int p_video_driver,int p_audio_driver) { - - - use_gl2=p_video_driver!=1; +void OS_Android::initialize(const VideoMode &p_desired, int p_video_driver, int p_audio_driver) { + use_gl2 = p_video_driver != 1; if (gfx_init_func) - gfx_init_func(gfx_init_ud,use_gl2); + gfx_init_func(gfx_init_ud, use_gl2); AudioDriverManagerSW::add_driver(&audio_driver_android); - - RasterizerGLES2 *rasterizer_gles22=memnew( RasterizerGLES2(false,use_reload_hooks,false,use_reload_hooks ) ); + RasterizerGLES2 *rasterizer_gles22 = memnew(RasterizerGLES2(false, use_reload_hooks, false, use_reload_hooks)); if (gl_extensions) rasterizer_gles22->set_extensions(gl_extensions); rasterizer = rasterizer_gles22; rasterizer->set_force_16_bits_fbo(use_16bits_fbo); - visual_server = memnew( VisualServerRaster(rasterizer) ); + visual_server = memnew(VisualServerRaster(rasterizer)); if (get_render_thread_mode() != RENDER_THREAD_UNSAFE) { visual_server = memnew(VisualServerWrapMT(visual_server, false)); @@ -149,37 +145,37 @@ void OS_Android::initialize(const VideoMode& p_desired,int p_video_driver,int p_ AudioDriverManagerSW::get_driver(p_audio_driver)->set_singleton(); - if (AudioDriverManagerSW::get_driver(p_audio_driver)->init()!=OK) { + if (AudioDriverManagerSW::get_driver(p_audio_driver)->init() != OK) { ERR_PRINT("Initializing audio failed."); } - sample_manager = memnew( SampleManagerMallocSW ); - audio_server = memnew( AudioServerSW(sample_manager) ); + sample_manager = memnew(SampleManagerMallocSW); + audio_server = memnew(AudioServerSW(sample_manager)); - audio_server->set_mixer_params(AudioMixerSW::INTERPOLATION_LINEAR,true); + audio_server->set_mixer_params(AudioMixerSW::INTERPOLATION_LINEAR, true); audio_server->init(); - spatial_sound_server = memnew( SpatialSoundServerSW ); + spatial_sound_server = memnew(SpatialSoundServerSW); spatial_sound_server->init(); - spatial_sound_2d_server = memnew( SpatialSound2DServerSW ); + spatial_sound_2d_server = memnew(SpatialSound2DServerSW); spatial_sound_2d_server->init(); // - physics_server = memnew( PhysicsServerSW ); + physics_server = memnew(PhysicsServerSW); physics_server->init(); //physics_2d_server = memnew( Physics2DServerSW ); physics_2d_server = Physics2DServerWrapMT::init_server<Physics2DServerSW>(); physics_2d_server->init(); - input = memnew( InputDefault ); + input = memnew(InputDefault); input->set_fallback_mapping("Default Android Gamepad"); } -void OS_Android::set_main_loop( MainLoop * p_main_loop ) { +void OS_Android::set_main_loop(MainLoop *p_main_loop) { - main_loop=p_main_loop; + main_loop = p_main_loop; input->set_main_loop(p_main_loop); #if 0 @@ -218,12 +214,11 @@ void OS_Android::set_main_loop( MainLoop * p_main_loop ) { } #endif - } void OS_Android::delete_main_loop() { - memdelete( main_loop ); + memdelete(main_loop); } void OS_Android::finalize() { @@ -231,29 +226,26 @@ void OS_Android::finalize() { memdelete(input); } +void OS_Android::vprint(const char *p_format, va_list p_list, bool p_stderr) { -void OS_Android::vprint(const char* p_format, va_list p_list, bool p_stderr) { - - __android_log_vprint(p_stderr?ANDROID_LOG_ERROR:ANDROID_LOG_INFO,"godot",p_format,p_list); + __android_log_vprint(p_stderr ? ANDROID_LOG_ERROR : ANDROID_LOG_INFO, "godot", p_format, p_list); } -void OS_Android::print(const char *p_format, ... ) { +void OS_Android::print(const char *p_format, ...) { va_list argp; va_start(argp, p_format); - __android_log_vprint(ANDROID_LOG_INFO,"godot",p_format,argp); + __android_log_vprint(ANDROID_LOG_INFO, "godot", p_format, argp); va_end(argp); - } -void OS_Android::alert(const String& p_alert,const String& p_title) { +void OS_Android::alert(const String &p_alert, const String &p_title) { - print("ALERT: %s\n",p_alert.utf8().get_data()); + print("ALERT: %s\n", p_alert.utf8().get_data()); if (alert_func) alert_func(p_alert, p_title); } - void OS_Android::set_mouse_show(bool p_show) { //android has no mouse... @@ -279,16 +271,14 @@ int OS_Android::get_mouse_button_state() const { return 0; } -void OS_Android::set_window_title(const String& p_title) { - +void OS_Android::set_window_title(const String &p_title) { } //interesting byt not yet //void set_clipboard(const String& p_text); //String get_clipboard() const; -void OS_Android::set_video_mode(const VideoMode& p_video_mode,int p_screen) { - +void OS_Android::set_video_mode(const VideoMode &p_video_mode, int p_screen) { } OS::VideoMode OS_Android::get_video_mode(int p_screen) const { @@ -296,7 +286,7 @@ OS::VideoMode OS_Android::get_video_mode(int p_screen) const { return default_videomode; } -void OS_Android::get_fullscreen_mode_list(List<VideoMode> *p_list,int p_screen) const { +void OS_Android::get_fullscreen_mode_list(List<VideoMode> *p_list, int p_screen) const { p_list->push_back(default_videomode); } @@ -311,7 +301,7 @@ void OS_Android::set_keep_screen_on(bool p_enabled) { Size2 OS_Android::get_window_size() const { - return Vector2(default_videomode.width,default_videomode.height); + return Vector2(default_videomode.width, default_videomode.height); } String OS_Android::get_name() { @@ -351,7 +341,6 @@ void OS_Android::main_loop_end() { if (main_loop) main_loop->finish(); - } void OS_Android::main_loop_focusout() { @@ -359,34 +348,32 @@ void OS_Android::main_loop_focusout() { if (main_loop) main_loop->notification(MainLoop::NOTIFICATION_WM_FOCUS_OUT); audio_driver_android.set_pause(true); - } -void OS_Android::main_loop_focusin(){ +void OS_Android::main_loop_focusin() { if (main_loop) main_loop->notification(MainLoop::NOTIFICATION_WM_FOCUS_IN); audio_driver_android.set_pause(false); - } void OS_Android::process_joy_event(OS_Android::JoystickEvent p_event) { switch (p_event.type) { - case JOY_EVENT_BUTTON: - last_id = input->joy_button(last_id, p_event.device, p_event.index, p_event.pressed); - break; - case JOY_EVENT_AXIS: - InputDefault::JoyAxis value; - value.min = -1; - value.value = p_event.value; - last_id = input->joy_axis(last_id, p_event.device, p_event.index, value); - break; - case JOY_EVENT_HAT: - last_id = input->joy_hat(last_id, p_event.device, p_event.hat); - break; - default: - return; + case JOY_EVENT_BUTTON: + last_id = input->joy_button(last_id, p_event.device, p_event.index, p_event.pressed); + break; + case JOY_EVENT_AXIS: + InputDefault::JoyAxis value; + value.min = -1; + value.value = p_event.value; + last_id = input->joy_axis(last_id, p_event.device, p_event.index, value); + break; + case JOY_EVENT_HAT: + last_id = input->joy_hat(last_id, p_event.device, p_event.hat); + break; + default: + return; } } @@ -396,163 +383,152 @@ void OS_Android::process_event(InputEvent p_event) { input->parse_input_event(p_event); } +void OS_Android::process_touch(int p_what, int p_pointer, const Vector<TouchPos> &p_points) { -void OS_Android::process_touch(int p_what,int p_pointer, const Vector<TouchPos>& p_points) { + // print_line("ev: "+itos(p_what)+" pnt: "+itos(p_pointer)+" pointc: "+itos(p_points.size())); -// print_line("ev: "+itos(p_what)+" pnt: "+itos(p_pointer)+" pointc: "+itos(p_points.size())); - - switch(p_what) { + switch (p_what) { case 0: { //gesture begin if (touch.size()) { //end all if exist InputEvent ev; - ev.type=InputEvent::MOUSE_BUTTON; - ev.ID=last_id++; - ev.mouse_button.button_index=BUTTON_LEFT; - ev.mouse_button.button_mask=BUTTON_MASK_LEFT; - ev.mouse_button.pressed=false; - ev.mouse_button.x=touch[0].pos.x; - ev.mouse_button.y=touch[0].pos.y; - ev.mouse_button.global_x=touch[0].pos.x; - ev.mouse_button.global_y=touch[0].pos.y; + ev.type = InputEvent::MOUSE_BUTTON; + ev.ID = last_id++; + ev.mouse_button.button_index = BUTTON_LEFT; + ev.mouse_button.button_mask = BUTTON_MASK_LEFT; + ev.mouse_button.pressed = false; + ev.mouse_button.x = touch[0].pos.x; + ev.mouse_button.y = touch[0].pos.y; + ev.mouse_button.global_x = touch[0].pos.x; + ev.mouse_button.global_y = touch[0].pos.y; input->parse_input_event(ev); - - for(int i=0;i<touch.size();i++) { + for (int i = 0; i < touch.size(); i++) { InputEvent ev; - ev.type=InputEvent::SCREEN_TOUCH; - ev.ID=last_id++; - ev.screen_touch.index=touch[i].id; - ev.screen_touch.pressed=false; - ev.screen_touch.x=touch[i].pos.x; - ev.screen_touch.y=touch[i].pos.y; + ev.type = InputEvent::SCREEN_TOUCH; + ev.ID = last_id++; + ev.screen_touch.index = touch[i].id; + ev.screen_touch.pressed = false; + ev.screen_touch.x = touch[i].pos.x; + ev.screen_touch.y = touch[i].pos.y; input->parse_input_event(ev); - } } touch.resize(p_points.size()); - for(int i=0;i<p_points.size();i++) { - touch[i].id=p_points[i].id; - touch[i].pos=p_points[i].pos; + for (int i = 0; i < p_points.size(); i++) { + touch[i].id = p_points[i].id; + touch[i].pos = p_points[i].pos; } { //send mouse InputEvent ev; - ev.type=InputEvent::MOUSE_BUTTON; - ev.ID=last_id++; - ev.mouse_button.button_index=BUTTON_LEFT; - ev.mouse_button.button_mask=BUTTON_MASK_LEFT; - ev.mouse_button.pressed=true; - ev.mouse_button.x=touch[0].pos.x; - ev.mouse_button.y=touch[0].pos.y; - ev.mouse_button.global_x=touch[0].pos.x; - ev.mouse_button.global_y=touch[0].pos.y; - last_mouse=touch[0].pos; + ev.type = InputEvent::MOUSE_BUTTON; + ev.ID = last_id++; + ev.mouse_button.button_index = BUTTON_LEFT; + ev.mouse_button.button_mask = BUTTON_MASK_LEFT; + ev.mouse_button.pressed = true; + ev.mouse_button.x = touch[0].pos.x; + ev.mouse_button.y = touch[0].pos.y; + ev.mouse_button.global_x = touch[0].pos.x; + ev.mouse_button.global_y = touch[0].pos.y; + last_mouse = touch[0].pos; input->parse_input_event(ev); } - //send touch - for(int i=0;i<touch.size();i++) { + for (int i = 0; i < touch.size(); i++) { InputEvent ev; - ev.type=InputEvent::SCREEN_TOUCH; - ev.ID=last_id++; - ev.screen_touch.index=touch[i].id; - ev.screen_touch.pressed=true; - ev.screen_touch.x=touch[i].pos.x; - ev.screen_touch.y=touch[i].pos.y; + ev.type = InputEvent::SCREEN_TOUCH; + ev.ID = last_id++; + ev.screen_touch.index = touch[i].id; + ev.screen_touch.pressed = true; + ev.screen_touch.x = touch[i].pos.x; + ev.screen_touch.y = touch[i].pos.y; input->parse_input_event(ev); } } break; case 1: { //motion - if (p_points.size()) { //send mouse, should look for point 0? InputEvent ev; - ev.type=InputEvent::MOUSE_MOTION; - ev.ID=last_id++; - ev.mouse_motion.button_mask=BUTTON_MASK_LEFT; - ev.mouse_motion.x=p_points[0].pos.x; - ev.mouse_motion.y=p_points[0].pos.y; - input->set_mouse_pos(Point2(ev.mouse_motion.x,ev.mouse_motion.y)); - ev.mouse_motion.speed_x=input->get_mouse_speed().x; - ev.mouse_motion.speed_y=input->get_mouse_speed().y; - ev.mouse_motion.relative_x=p_points[0].pos.x-last_mouse.x; - ev.mouse_motion.relative_y=p_points[0].pos.y-last_mouse.y; - last_mouse=p_points[0].pos; + ev.type = InputEvent::MOUSE_MOTION; + ev.ID = last_id++; + ev.mouse_motion.button_mask = BUTTON_MASK_LEFT; + ev.mouse_motion.x = p_points[0].pos.x; + ev.mouse_motion.y = p_points[0].pos.y; + input->set_mouse_pos(Point2(ev.mouse_motion.x, ev.mouse_motion.y)); + ev.mouse_motion.speed_x = input->get_mouse_speed().x; + ev.mouse_motion.speed_y = input->get_mouse_speed().y; + ev.mouse_motion.relative_x = p_points[0].pos.x - last_mouse.x; + ev.mouse_motion.relative_y = p_points[0].pos.y - last_mouse.y; + last_mouse = p_points[0].pos; input->parse_input_event(ev); } - ERR_FAIL_COND(touch.size()!=p_points.size()); + ERR_FAIL_COND(touch.size() != p_points.size()); - for(int i=0;i<touch.size();i++) { + for (int i = 0; i < touch.size(); i++) { - int idx=-1; - for(int j=0;j<p_points.size();j++) { + int idx = -1; + for (int j = 0; j < p_points.size(); j++) { - if (touch[i].id==p_points[j].id) { - idx=j; + if (touch[i].id == p_points[j].id) { + idx = j; break; } - } - ERR_CONTINUE(idx==-1); + ERR_CONTINUE(idx == -1); - if (touch[i].pos==p_points[idx].pos) + if (touch[i].pos == p_points[idx].pos) continue; //no move unncesearily InputEvent ev; - ev.type=InputEvent::SCREEN_DRAG; - ev.ID=last_id++; - ev.screen_drag.index=touch[i].id; - ev.screen_drag.x=p_points[idx].pos.x; - ev.screen_drag.y=p_points[idx].pos.y; - ev.screen_drag.relative_x=p_points[idx].pos.x - touch[i].pos.x; - ev.screen_drag.relative_y=p_points[idx].pos.y - touch[i].pos.y; + ev.type = InputEvent::SCREEN_DRAG; + ev.ID = last_id++; + ev.screen_drag.index = touch[i].id; + ev.screen_drag.x = p_points[idx].pos.x; + ev.screen_drag.y = p_points[idx].pos.y; + ev.screen_drag.relative_x = p_points[idx].pos.x - touch[i].pos.x; + ev.screen_drag.relative_y = p_points[idx].pos.y - touch[i].pos.y; input->parse_input_event(ev); - touch[i].pos=p_points[idx].pos; + touch[i].pos = p_points[idx].pos; } - } break; case 2: { //release - - if (touch.size()) { //end all if exist InputEvent ev; - ev.type=InputEvent::MOUSE_BUTTON; - ev.ID=last_id++; - ev.mouse_button.button_index=BUTTON_LEFT; - ev.mouse_button.button_mask=BUTTON_MASK_LEFT; - ev.mouse_button.pressed=false; - ev.mouse_button.x=touch[0].pos.x; - ev.mouse_button.y=touch[0].pos.y; - ev.mouse_button.global_x=touch[0].pos.x; - ev.mouse_button.global_y=touch[0].pos.y; + ev.type = InputEvent::MOUSE_BUTTON; + ev.ID = last_id++; + ev.mouse_button.button_index = BUTTON_LEFT; + ev.mouse_button.button_mask = BUTTON_MASK_LEFT; + ev.mouse_button.pressed = false; + ev.mouse_button.x = touch[0].pos.x; + ev.mouse_button.y = touch[0].pos.y; + ev.mouse_button.global_x = touch[0].pos.x; + ev.mouse_button.global_y = touch[0].pos.y; input->parse_input_event(ev); - - for(int i=0;i<touch.size();i++) { + for (int i = 0; i < touch.size(); i++) { InputEvent ev; - ev.type=InputEvent::SCREEN_TOUCH; - ev.ID=last_id++; - ev.screen_touch.index=touch[i].id; - ev.screen_touch.pressed=false; - ev.screen_touch.x=touch[i].pos.x; - ev.screen_touch.y=touch[i].pos.y; + ev.type = InputEvent::SCREEN_TOUCH; + ev.ID = last_id++; + ev.screen_touch.index = touch[i].id; + ev.screen_touch.pressed = false; + ev.screen_touch.x = touch[i].pos.x; + ev.screen_touch.y = touch[i].pos.y; input->parse_input_event(ev); - } touch.clear(); } @@ -560,38 +536,33 @@ void OS_Android::process_touch(int p_what,int p_pointer, const Vector<TouchPos>& } break; case 3: { // add tuchi + ERR_FAIL_INDEX(p_pointer, p_points.size()); - - - - ERR_FAIL_INDEX(p_pointer,p_points.size()); - - TouchPos tp=p_points[p_pointer]; + TouchPos tp = p_points[p_pointer]; touch.push_back(tp); InputEvent ev; - ev.type=InputEvent::SCREEN_TOUCH; - ev.ID=last_id++; - ev.screen_touch.index=tp.id; - ev.screen_touch.pressed=true; - ev.screen_touch.x=tp.pos.x; - ev.screen_touch.y=tp.pos.y; + ev.type = InputEvent::SCREEN_TOUCH; + ev.ID = last_id++; + ev.screen_touch.index = tp.id; + ev.screen_touch.pressed = true; + ev.screen_touch.x = tp.pos.x; + ev.screen_touch.y = tp.pos.y; input->parse_input_event(ev); } break; case 4: { - - for(int i=0;i<touch.size();i++) { - if (touch[i].id==p_pointer) { + for (int i = 0; i < touch.size(); i++) { + if (touch[i].id == p_pointer) { InputEvent ev; - ev.type=InputEvent::SCREEN_TOUCH; - ev.ID=last_id++; - ev.screen_touch.index=touch[i].id; - ev.screen_touch.pressed=false; - ev.screen_touch.x=touch[i].pos.x; - ev.screen_touch.y=touch[i].pos.y; + ev.type = InputEvent::SCREEN_TOUCH; + ev.ID = last_id++; + ev.screen_touch.index = touch[i].id; + ev.screen_touch.pressed = false; + ev.screen_touch.x = touch[i].pos.x; + ev.screen_touch.y = touch[i].pos.y; input->parse_input_event(ev); touch.remove(i); i--; @@ -599,22 +570,20 @@ void OS_Android::process_touch(int p_what,int p_pointer, const Vector<TouchPos>& } } break; - } - } -void OS_Android::process_accelerometer(const Vector3& p_accelerometer) { +void OS_Android::process_accelerometer(const Vector3 &p_accelerometer) { input->set_accelerometer(p_accelerometer); } -void OS_Android::process_magnetometer(const Vector3& p_magnetometer) { +void OS_Android::process_magnetometer(const Vector3 &p_magnetometer) { input->set_magnetometer(p_magnetometer); } -void OS_Android::process_gyroscope(const Vector3& p_gyroscope) { +void OS_Android::process_gyroscope(const Vector3 &p_gyroscope) { input->set_gyroscope(p_gyroscope); } @@ -629,7 +598,7 @@ bool OS_Android::has_virtual_keyboard() const { return true; } -void OS_Android::show_virtual_keyboard(const String& p_existing_text,const Rect2& p_screen_rect) { +void OS_Android::show_virtual_keyboard(const String &p_existing_text, const Rect2 &p_screen_rect) { if (show_virtual_keyboard_func) { show_virtual_keyboard_func(p_existing_text); @@ -650,13 +619,12 @@ void OS_Android::hide_virtual_keyboard() { }; } +void OS_Android::init_video_mode(int p_video_width, int p_video_height) { -void OS_Android::init_video_mode(int p_video_width,int p_video_height) { - - default_videomode.width=p_video_width; - default_videomode.height=p_video_height; - default_videomode.fullscreen=true; - default_videomode.resizable=false; + default_videomode.width = p_video_width; + default_videomode.height = p_video_height; + default_videomode.fullscreen = true; + default_videomode.resizable = false; } void OS_Android::main_loop_request_quit() { @@ -667,14 +635,14 @@ void OS_Android::main_loop_request_quit() { void OS_Android::set_display_size(Size2 p_size) { - default_videomode.width=p_size.x; - default_videomode.height=p_size.y; + default_videomode.width = p_size.x; + default_videomode.height = p_size.y; } void OS_Android::reload_gfx() { if (gfx_init_func) - gfx_init_func(gfx_init_ud,use_gl2); + gfx_init_func(gfx_init_ud, use_gl2); if (rasterizer) rasterizer->reload_vram(); } @@ -682,7 +650,7 @@ void OS_Android::reload_gfx() { Error OS_Android::shell_open(String p_uri) { if (open_uri_func) - return open_uri_func(p_uri)?ERR_CANT_OPEN:OK; + return open_uri_func(p_uri) ? ERR_CANT_OPEN : OK; return ERR_UNAVAILABLE; } @@ -700,9 +668,9 @@ String OS_Android::get_locale() const { String OS_Android::get_model_name() const { - if (get_model_func) - return get_model_func(); - return OS_Unix::get_model_name(); + if (get_model_func) + return get_model_func(); + return OS_Unix::get_model_name(); } int OS_Android::get_screen_dpi(int p_screen) const { @@ -715,27 +683,27 @@ int OS_Android::get_screen_dpi(int p_screen) const { void OS_Android::set_need_reload_hooks(bool p_needs_them) { - use_reload_hooks=p_needs_them; + use_reload_hooks = p_needs_them; } String OS_Android::get_data_dir() const { - if (data_dir_cache!=String()) + if (data_dir_cache != String()) return data_dir_cache; if (get_data_dir_func) { - String data_dir=get_data_dir_func(); + String data_dir = get_data_dir_func(); //store current dir char real_current_dir_name[2048]; - getcwd(real_current_dir_name,2048); + getcwd(real_current_dir_name, 2048); //go to data dir chdir(data_dir.utf8().get_data()); //get actual data dir, so we resolve potential symlink (Android 6.0+ seems to use symlink) char data_current_dir_name[2048]; - getcwd(data_current_dir_name,2048); + getcwd(data_current_dir_name, 2048); //cache by parsing utf8 data_dir_cache.parse_utf8(data_current_dir_name); @@ -746,19 +714,16 @@ String OS_Android::get_data_dir() const { return data_dir_cache; } - return "."; //return Globals::get_singleton()->get_singleton_object("GodotOS")->call("get_data_dir"); } - void OS_Android::set_screen_orientation(ScreenOrientation p_orientation) { if (set_screen_orientation_func) set_screen_orientation_func(p_orientation); } - String OS_Android::get_unique_ID() const { if (get_unique_id_func) @@ -769,13 +734,13 @@ String OS_Android::get_unique_ID() const { Error OS_Android::native_video_play(String p_path, float p_volume) { if (video_play_func) video_play_func(p_path); - return OK; + return OK; } bool OS_Android::native_video_is_playing() { if (video_is_playing_func) return video_is_playing_func(); - return false; + return false; } void OS_Android::native_video_pause() { @@ -797,7 +762,7 @@ void OS_Android::native_video_stop() { void OS_Android::set_context_is_16_bits(bool p_is_16) { - use_16bits_fbo=p_is_16; + use_16bits_fbo = p_is_16; if (rasterizer) rasterizer->set_force_16_bits_fbo(p_is_16); } @@ -814,29 +779,29 @@ String OS_Android::get_joy_guid(int p_device) const { return input->get_joy_guid_remapped(p_device); } -OS_Android::OS_Android(GFXInitFunc p_gfx_init_func,void*p_gfx_init_ud, OpenURIFunc p_open_uri_func, GetDataDirFunc p_get_data_dir_func,GetLocaleFunc p_get_locale_func,GetModelFunc p_get_model_func, GetScreenDPIFunc p_get_screen_dpi_func, ShowVirtualKeyboardFunc p_show_vk, HideVirtualKeyboardFunc p_hide_vk, SetScreenOrientationFunc p_screen_orient,GetUniqueIDFunc p_get_unique_id,GetSystemDirFunc p_get_sdir_func, VideoPlayFunc p_video_play_func, VideoIsPlayingFunc p_video_is_playing_func, VideoPauseFunc p_video_pause_func, VideoStopFunc p_video_stop_func, SetKeepScreenOnFunc p_set_keep_screen_on_func, AlertFunc p_alert_func, bool p_use_apk_expansion) { +OS_Android::OS_Android(GFXInitFunc p_gfx_init_func, void *p_gfx_init_ud, OpenURIFunc p_open_uri_func, GetDataDirFunc p_get_data_dir_func, GetLocaleFunc p_get_locale_func, GetModelFunc p_get_model_func, GetScreenDPIFunc p_get_screen_dpi_func, ShowVirtualKeyboardFunc p_show_vk, HideVirtualKeyboardFunc p_hide_vk, SetScreenOrientationFunc p_screen_orient, GetUniqueIDFunc p_get_unique_id, GetSystemDirFunc p_get_sdir_func, VideoPlayFunc p_video_play_func, VideoIsPlayingFunc p_video_is_playing_func, VideoPauseFunc p_video_pause_func, VideoStopFunc p_video_stop_func, SetKeepScreenOnFunc p_set_keep_screen_on_func, AlertFunc p_alert_func, bool p_use_apk_expansion) { - use_apk_expansion=p_use_apk_expansion; - default_videomode.width=800; - default_videomode.height=600; - default_videomode.fullscreen=true; - default_videomode.resizable=false; + use_apk_expansion = p_use_apk_expansion; + default_videomode.width = 800; + default_videomode.height = 600; + default_videomode.fullscreen = true; + default_videomode.resizable = false; - gfx_init_func=p_gfx_init_func; - gfx_init_ud=p_gfx_init_ud; - main_loop=NULL; - last_id=1; - gl_extensions=NULL; - rasterizer=NULL; - use_gl2=false; + gfx_init_func = p_gfx_init_func; + gfx_init_ud = p_gfx_init_ud; + main_loop = NULL; + last_id = 1; + gl_extensions = NULL; + rasterizer = NULL; + use_gl2 = false; - open_uri_func=p_open_uri_func; - get_data_dir_func=p_get_data_dir_func; - get_locale_func=p_get_locale_func; - get_model_func=p_get_model_func; + open_uri_func = p_open_uri_func; + get_data_dir_func = p_get_data_dir_func; + get_locale_func = p_get_locale_func; + get_model_func = p_get_model_func; get_screen_dpi_func = p_get_screen_dpi_func; - get_unique_id_func=p_get_unique_id; - get_system_dir_func=p_get_sdir_func; + get_unique_id_func = p_get_unique_id; + get_system_dir_func = p_get_sdir_func; video_play_func = p_video_play_func; video_is_playing_func = p_video_is_playing_func; @@ -846,13 +811,11 @@ OS_Android::OS_Android(GFXInitFunc p_gfx_init_func,void*p_gfx_init_ud, OpenURIFu show_virtual_keyboard_func = p_show_vk; hide_virtual_keyboard_func = p_hide_vk; - set_screen_orientation_func=p_screen_orient; + set_screen_orientation_func = p_screen_orient; set_keep_screen_on_func = p_set_keep_screen_on_func; alert_func = p_alert_func; - use_reload_hooks=false; - + use_reload_hooks = false; } OS_Android::~OS_Android() { - } diff --git a/platform/android/os_android.h b/platform/android/os_android.h index 68b50b208..f035edc88 100644 --- a/platform/android/os_android.h +++ b/platform/android/os_android.h @@ -29,57 +29,54 @@ #ifndef OS_ANDROID_H #define OS_ANDROID_H -#include "os/input.h" #include "drivers/unix/os_unix.h" +#include "main/input_default.h" +#include "os/input.h" #include "os/main_loop.h" -#include "servers/physics/physics_server_sw.h" -#include "servers/spatial_sound/spatial_sound_server_sw.h" -#include "servers/spatial_sound_2d/spatial_sound_2d_server_sw.h" #include "servers/audio/audio_server_sw.h" +#include "servers/physics/physics_server_sw.h" #include "servers/physics_2d/physics_2d_server_sw.h" #include "servers/physics_2d/physics_2d_server_wrap_mt.h" +#include "servers/spatial_sound/spatial_sound_server_sw.h" +#include "servers/spatial_sound_2d/spatial_sound_2d_server_sw.h" #include "servers/visual/rasterizer.h" -#include "main/input_default.h" //#ifdef USE_JAVA_FILE_ACCESS - #ifdef ANDROID_NATIVE_ACTIVITY -#include <android/sensor.h> #include <android/log.h> +#include <android/sensor.h> #include <android_native_app_glue.h> #else - #endif #include "audio_driver_jandroid.h" #include "audio_driver_opensl.h" -typedef void (*GFXInitFunc)(void *ud,bool gl2); -typedef int (*OpenURIFunc)(const String&); +typedef void (*GFXInitFunc)(void *ud, bool gl2); +typedef int (*OpenURIFunc)(const String &); typedef String (*GetDataDirFunc)(); typedef String (*GetLocaleFunc)(); typedef String (*GetModelFunc)(); typedef int (*GetScreenDPIFunc)(); typedef String (*GetUniqueIDFunc)(); -typedef void (*ShowVirtualKeyboardFunc)(const String&); +typedef void (*ShowVirtualKeyboardFunc)(const String &); typedef void (*HideVirtualKeyboardFunc)(); typedef void (*SetScreenOrientationFunc)(int); typedef String (*GetSystemDirFunc)(int); -typedef void (*VideoPlayFunc)(const String&); +typedef void (*VideoPlayFunc)(const String &); typedef bool (*VideoIsPlayingFunc)(); typedef void (*VideoPauseFunc)(); typedef void (*VideoStopFunc)(); typedef void (*SetKeepScreenOnFunc)(bool p_enabled); -typedef void (*AlertFunc)(const String&, const String&); +typedef void (*AlertFunc)(const String &, const String &); class OS_Android : public OS_Unix { public: - struct TouchPos { int id; Point2 pos; @@ -102,13 +99,12 @@ public: }; private: - Vector<TouchPos> touch; Point2 last_mouse; unsigned int last_id; GFXInitFunc gfx_init_func; - void*gfx_init_ud; + void *gfx_init_ud; bool use_gl2; bool use_reload_hooks; @@ -133,11 +129,11 @@ private: AudioDriverOpenSL audio_driver_android; #endif - const char* gl_extensions; + const char *gl_extensions; InputDefault *input; VideoMode default_videomode; - MainLoop * main_loop; + MainLoop *main_loop; OpenURIFunc open_uri_func; GetDataDirFunc get_data_dir_func; @@ -158,47 +154,44 @@ private: AlertFunc alert_func; public: - // functions used by main to initialize/deintialize the OS virtual int get_video_driver_count() const; - virtual const char * get_video_driver_name(int p_driver) const; + virtual const char *get_video_driver_name(int p_driver) const; virtual VideoMode get_default_video_mode() const; virtual int get_audio_driver_count() const; - virtual const char * get_audio_driver_name(int p_driver) const; + virtual const char *get_audio_driver_name(int p_driver) const; virtual void initialize_core(); - virtual void initialize(const VideoMode& p_desired,int p_video_driver,int p_audio_driver); + virtual void initialize(const VideoMode &p_desired, int p_video_driver, int p_audio_driver); - virtual void set_main_loop( MainLoop * p_main_loop ); + virtual void set_main_loop(MainLoop *p_main_loop); virtual void delete_main_loop(); virtual void finalize(); - typedef int64_t ProcessID; - static OS* get_singleton(); - - virtual void vprint(const char* p_format, va_list p_list, bool p_stderr=false); - virtual void print(const char *p_format, ... ); - virtual void alert(const String& p_alert,const String& p_title="ALERT!"); + static OS *get_singleton(); + virtual void vprint(const char *p_format, va_list p_list, bool p_stderr = false); + virtual void print(const char *p_format, ...); + virtual void alert(const String &p_alert, const String &p_title = "ALERT!"); virtual void set_mouse_show(bool p_show); virtual void set_mouse_grab(bool p_grab); virtual bool is_mouse_grab_enabled() const; virtual Point2 get_mouse_pos() const; virtual int get_mouse_button_state() const; - virtual void set_window_title(const String& p_title); + virtual void set_window_title(const String &p_title); //virtual void set_clipboard(const String& p_text); //virtual String get_clipboard() const; - virtual void set_video_mode(const VideoMode& p_video_mode,int p_screen=0); - virtual VideoMode get_video_mode(int p_screen=0) const; - virtual void get_fullscreen_mode_list(List<VideoMode> *p_list,int p_screen=0) const; + virtual void set_video_mode(const VideoMode &p_video_mode, int p_screen = 0); + virtual VideoMode get_video_mode(int p_screen = 0) const; + virtual void get_fullscreen_mode_list(List<VideoMode> *p_list, int p_screen = 0) const; virtual void set_keep_screen_on(bool p_enabled); @@ -221,10 +214,10 @@ public: virtual bool has_touchscreen_ui_hint() const; virtual bool has_virtual_keyboard() const; - virtual void show_virtual_keyboard(const String& p_existing_text,const Rect2& p_screen_rect=Rect2()); + virtual void show_virtual_keyboard(const String &p_existing_text, const Rect2 &p_screen_rect = Rect2()); virtual void hide_virtual_keyboard(); - void set_opengl_extensions(const char* p_gl_extensions); + void set_opengl_extensions(const char *p_gl_extensions); void set_display_size(Size2 p_size); void reload_gfx(); @@ -238,20 +231,19 @@ public: virtual String get_resource_dir() const; virtual String get_locale() const; virtual String get_model_name() const; - virtual int get_screen_dpi(int p_screen=0) const; + virtual int get_screen_dpi(int p_screen = 0) const; virtual String get_unique_ID() const; virtual String get_system_dir(SystemDir p_dir) const; - - void process_accelerometer(const Vector3& p_accelerometer); - void process_magnetometer(const Vector3& p_magnetometer); - void process_gyroscope(const Vector3& p_gyroscope); - void process_touch(int p_what,int p_pointer, const Vector<TouchPos>& p_points); + void process_accelerometer(const Vector3 &p_accelerometer); + void process_magnetometer(const Vector3 &p_magnetometer); + void process_gyroscope(const Vector3 &p_gyroscope); + void process_touch(int p_what, int p_pointer, const Vector<TouchPos> &p_points); void process_joy_event(JoystickEvent p_event); void process_event(InputEvent p_event); - void init_video_mode(int p_video_width,int p_video_height); + void init_video_mode(int p_video_width, int p_video_height); virtual Error native_video_play(String p_path, float p_volume); virtual bool native_video_is_playing(); @@ -262,9 +254,8 @@ public: virtual String get_joy_guid(int p_device) const; void joy_connection_changed(int p_device, bool p_connected, String p_name); - OS_Android(GFXInitFunc p_gfx_init_func,void*p_gfx_init_ud, OpenURIFunc p_open_uri_func, GetDataDirFunc p_get_data_dir_func,GetLocaleFunc p_get_locale_func,GetModelFunc p_get_model_func, GetScreenDPIFunc p_get_screen_dpi_func, ShowVirtualKeyboardFunc p_show_vk, HideVirtualKeyboardFunc p_hide_vk, SetScreenOrientationFunc p_screen_orient,GetUniqueIDFunc p_get_unique_id,GetSystemDirFunc p_get_sdir_func, VideoPlayFunc p_video_play_func, VideoIsPlayingFunc p_video_is_playing_func, VideoPauseFunc p_video_pause_func, VideoStopFunc p_video_stop_func, SetKeepScreenOnFunc p_set_keep_screen_on_func, AlertFunc p_alert_func, bool p_use_apk_expansion); + OS_Android(GFXInitFunc p_gfx_init_func, void *p_gfx_init_ud, OpenURIFunc p_open_uri_func, GetDataDirFunc p_get_data_dir_func, GetLocaleFunc p_get_locale_func, GetModelFunc p_get_model_func, GetScreenDPIFunc p_get_screen_dpi_func, ShowVirtualKeyboardFunc p_show_vk, HideVirtualKeyboardFunc p_hide_vk, SetScreenOrientationFunc p_screen_orient, GetUniqueIDFunc p_get_unique_id, GetSystemDirFunc p_get_sdir_func, VideoPlayFunc p_video_play_func, VideoIsPlayingFunc p_video_is_playing_func, VideoPauseFunc p_video_pause_func, VideoStopFunc p_video_stop_func, SetKeepScreenOnFunc p_set_keep_screen_on_func, AlertFunc p_alert_func, bool p_use_apk_expansion); ~OS_Android(); - }; #endif diff --git a/platform/android/thread_jandroid.cpp b/platform/android/thread_jandroid.cpp index aa40d995d..854cdb1e3 100644 --- a/platform/android/thread_jandroid.cpp +++ b/platform/android/thread_jandroid.cpp @@ -36,29 +36,29 @@ Thread::ID ThreadAndroid::get_ID() const { return id; } -Thread* ThreadAndroid::create_thread_jandroid() { +Thread *ThreadAndroid::create_thread_jandroid() { - return memnew( ThreadAndroid ); + return memnew(ThreadAndroid); } void *ThreadAndroid::thread_callback(void *userdata) { - ThreadAndroid *t=reinterpret_cast<ThreadAndroid*>(userdata); + ThreadAndroid *t = reinterpret_cast<ThreadAndroid *>(userdata); setup_thread(); ScriptServer::thread_enter(); //scripts may need to attach a stack - t->id=(ID)pthread_self(); + t->id = (ID)pthread_self(); t->callback(t->user); ScriptServer::thread_exit(); return NULL; } -Thread* ThreadAndroid::create_func_jandroid(ThreadCreateCallback p_callback,void *p_user,const Settings&) { +Thread *ThreadAndroid::create_func_jandroid(ThreadCreateCallback p_callback, void *p_user, const Settings &) { - ThreadAndroid *tr= memnew(ThreadAndroid); - tr->callback=p_callback; - tr->user=p_user; + ThreadAndroid *tr = memnew(ThreadAndroid); + tr->callback = p_callback; + tr->user = p_user; pthread_attr_init(&tr->pthread_attr); - pthread_attr_setdetachstate(&tr->pthread_attr, PTHREAD_CREATE_JOINABLE); + pthread_attr_setdetachstate(&tr->pthread_attr, PTHREAD_CREATE_JOINABLE); pthread_create(&tr->pthread, &tr->pthread_attr, thread_callback, tr); @@ -70,29 +70,28 @@ Thread::ID ThreadAndroid::get_thread_ID_func_jandroid() { return (ID)pthread_self(); } -void ThreadAndroid::wait_to_finish_func_jandroid(Thread* p_thread) { +void ThreadAndroid::wait_to_finish_func_jandroid(Thread *p_thread) { - ThreadAndroid *tp=static_cast<ThreadAndroid*>(p_thread); + ThreadAndroid *tp = static_cast<ThreadAndroid *>(p_thread); ERR_FAIL_COND(!tp); - ERR_FAIL_COND(tp->pthread==0); + ERR_FAIL_COND(tp->pthread == 0); - pthread_join(tp->pthread,NULL); - tp->pthread=0; + pthread_join(tp->pthread, NULL); + tp->pthread = 0; } -void ThreadAndroid::_thread_destroyed(void* value) { +void ThreadAndroid::_thread_destroyed(void *value) { /* The thread is being destroyed, detach it from the Java VM and set the mThreadKey value to NULL as required */ - JNIEnv *env = (JNIEnv*) value; + JNIEnv *env = (JNIEnv *)value; if (env != NULL) { java_vm->DetachCurrentThread(); pthread_setspecific(jvm_key, NULL); } - } pthread_key_t ThreadAndroid::jvm_key; -JavaVM* ThreadAndroid::java_vm=NULL; +JavaVM *ThreadAndroid::java_vm = NULL; void ThreadAndroid::setup_thread() { @@ -100,19 +99,17 @@ void ThreadAndroid::setup_thread() { return; //already setup JNIEnv *env; java_vm->AttachCurrentThread(&env, NULL); - pthread_setspecific(jvm_key, (void*) env); - + pthread_setspecific(jvm_key, (void *)env); } -void ThreadAndroid::make_default(JavaVM* p_java_vm) { +void ThreadAndroid::make_default(JavaVM *p_java_vm) { - java_vm=p_java_vm; - create_func=create_func_jandroid; - get_thread_ID_func=get_thread_ID_func_jandroid; - wait_to_finish_func=wait_to_finish_func_jandroid; + java_vm = p_java_vm; + create_func = create_func_jandroid; + get_thread_ID_func = get_thread_ID_func_jandroid; + wait_to_finish_func = wait_to_finish_func_jandroid; pthread_key_create(&jvm_key, _thread_destroyed); setup_thread(); - } JNIEnv *ThreadAndroid::get_env() { @@ -121,20 +118,15 @@ JNIEnv *ThreadAndroid::get_env() { setup_thread(); } - JNIEnv *env=NULL; + JNIEnv *env = NULL; int status = java_vm->AttachCurrentThread(&env, NULL); return env; } - ThreadAndroid::ThreadAndroid() { - pthread=0; + pthread = 0; } - ThreadAndroid::~ThreadAndroid() { - } - - diff --git a/platform/android/thread_jandroid.h b/platform/android/thread_jandroid.h index 6f52b730f..a8d8a4d8b 100644 --- a/platform/android/thread_jandroid.h +++ b/platform/android/thread_jandroid.h @@ -33,11 +33,10 @@ @author Juan Linietsky <reduzio@gmail.com> */ - -#include <sys/types.h> -#include <pthread.h> #include "os/thread.h" #include <jni.h> +#include <pthread.h> +#include <sys/types.h> class ThreadAndroid : public Thread { @@ -47,36 +46,28 @@ class ThreadAndroid : public Thread { void *user; ID id; - static Thread* create_thread_jandroid(); - + static Thread *create_thread_jandroid(); static void *thread_callback(void *userdata); - static Thread* create_func_jandroid(ThreadCreateCallback p_callback,void *,const Settings&); + static Thread *create_func_jandroid(ThreadCreateCallback p_callback, void *, const Settings &); static ID get_thread_ID_func_jandroid(); - static void wait_to_finish_func_jandroid(Thread* p_thread); + static void wait_to_finish_func_jandroid(Thread *p_thread); - static void _thread_destroyed(void* value); + static void _thread_destroyed(void *value); ThreadAndroid(); static pthread_key_t jvm_key; - static JavaVM* java_vm; -public: - - - + static JavaVM *java_vm; +public: virtual ID get_ID() const; - static void make_default(JavaVM* p_java_vm); + static void make_default(JavaVM *p_java_vm); static void setup_thread(); static JNIEnv *get_env(); - ~ThreadAndroid(); - }; - - #endif |
