aboutsummaryrefslogtreecommitdiff
path: root/src
Commit message (Expand)AuthorAge
...
* Add ban management routines to Lua APIMatthew I2012-08-12
* Extend Lua API in order to implement chat commandsMatthew I2012-08-12
* Remove trailing comma after player list in server status stringMatthew I2012-08-12
* Allow digging of unknown nodesMatthew I2012-08-12
* Fix wrong amount of nodes being dropped from inventoryPerttu Ahola2012-08-12
* fix node timers so on_timer gets the correct positiondarkrose2012-08-12
* Remove unwanted ! from ifs in inventory record-for-rollback codePerttu Ahola2012-08-12
* Fix inventory segfault when rollback recording is disabledPerttu Ahola2012-07-28
* Add enable_rollback_recording setting, defaulting to falsePerttu Ahola2012-07-28
* Handle max<min in LuaPseudoRandom::l_next()Perttu Ahola2012-07-27
* Tweak rollback and liquidsPerttu Ahola2012-07-27
* Tweak rollback stuffPerttu Ahola2012-07-27
* Increase automatic suspect guess timeframePerttu Ahola2012-07-27
* ABM and liquid overload skipPerttu Ahola2012-07-27
* Fix server build (a missing header)Perttu Ahola2012-07-27
* Make the rollback system VERY FUCKING GOD DAMN POWERFULPerttu Ahola2012-07-27
* Don't track liquids for rollback because of too much logPerttu Ahola2012-07-27
* Properly rollback chat command triggered thingsPerttu Ahola2012-07-27
* Experimental-ish rollback functionalityPerttu Ahola2012-07-27
* Working group-shapeless and multigroup recipesPerttu Ahola2012-07-26
* Restore focus to formspec menu when pressing a buttonPerttu Ahola2012-07-25
* Add special return value -1 to inventry callbacksPerttu Ahola2012-07-25
* Improve formspec positioningPerttu Ahola2012-07-25
* Improve inventory callbacks a bitPerttu Ahola2012-07-25
* Remove special handling of creative modePerttu Ahola2012-07-25
* Detached inventory callbacks and reworked node metadata callbacksPerttu Ahola2012-07-25
* Detached inventoriesPerttu Ahola2012-07-24
* darkrose should work at a nuclear power plant.Perttu Ahola2012-07-24
* Improve node timer format (map format version 25) and update mapformat.txtPerttu Ahola2012-07-24
* Fix building on top of (pointable && buildable_to) nodesPerttu Ahola2012-07-23
* Improve build configuration optionsPerttu Ahola2012-07-23
* Fix map deserialization and remove old serialization codePerttu Ahola2012-07-23
* Increase node id/param0 to 16 bits, leaving param2 always with 8 bitsdarkrose2012-07-23
* Implement node timersdarkrose2012-07-23
* Fix terrible grammar in comment!Perttu Ahola2012-07-22
* Fix compressZlib()Perttu Ahola2012-07-22
* Test zlib wrapper's handling of large dataPerttu Ahola2012-07-22
* Tweak test.c overally a bitPerttu Ahola2012-07-22
* Formspec button_exit[] and image_button_exit[]Perttu Ahola2012-07-22
* minetest.register_on_player_receive_fields()Perttu Ahola2012-07-22
* Implement formspecdarkrose2012-07-22
* Add minetest.get_modnames() to Lua APIMatthew I2012-07-22
* Fix signedness warning in base64.cppAndreas Zwinkau2012-07-21
* Fix wctomb useAndreas Zwinkau2012-07-21
* Remove mbtowc warningsAndreas Zwinkau2012-07-21
* Fix hovering after mining a block underneath you while sneakingMatthew I2012-07-21
* Rotate facedir-rotated top and bottom textures too, and re-implement nodebox ...Perttu Ahola2012-07-21
* Facedir rotation of nodebox texturesPerttu Ahola2012-07-21
* Fix signed overflow in getPointedThingBad-Command2012-07-21
* Fix typo in scriptapi.cpp in minetest.get_craft_recipe()Perttu Ahola2012-07-21
opt">; Thread::setName("Main"); try { app_dummy(); char *argv[] = {strdup(PROJECT_NAME), NULL}; main(ARRLEN(argv) - 1, argv); free(argv[0]); } catch (std::exception &e) { errorstream << "Uncaught exception in main thread: " << e.what() << std::endl; retval = -1; } catch (...) { errorstream << "Uncaught exception in main thread!" << std::endl; retval = -1; } porting::cleanupAndroid(); infostream << "Shutting down." << std::endl; exit(retval); } /* handler for finished message box input */ /* Intentionally NOT in namespace porting */ /* TODO this doesn't work as expected, no idea why but there's a workaround */ /* for it right now */ extern "C" { JNIEXPORT void JNICALL Java_net_minetest_MtNativeActivity_putMessageBoxResult( JNIEnv * env, jclass thiz, jstring text) { errorstream << "Java_net_minetest_MtNativeActivity_putMessageBoxResult got: " << std::string((const char*)env->GetStringChars(text,0)) << std::endl; } } namespace porting { std::string path_storage = DIR_DELIM "sdcard" DIR_DELIM; android_app* app_global; JNIEnv* jnienv; jclass nativeActivity; jclass findClass(std::string classname) { if (jnienv == 0) { return 0; } jclass nativeactivity = jnienv->FindClass("android/app/NativeActivity"); jmethodID getClassLoader = jnienv->GetMethodID(nativeactivity,"getClassLoader", "()Ljava/lang/ClassLoader;"); jobject cls = jnienv->CallObjectMethod(app_global->activity->clazz, getClassLoader); jclass classLoader = jnienv->FindClass("java/lang/ClassLoader"); jmethodID findClass = jnienv->GetMethodID(classLoader, "loadClass", "(Ljava/lang/String;)Ljava/lang/Class;"); jstring strClassName = jnienv->NewStringUTF(classname.c_str()); return (jclass) jnienv->CallObjectMethod(cls, findClass, strClassName); } void copyAssets() { jmethodID assetcopy = jnienv->GetMethodID(nativeActivity,"copyAssets","()V"); if (assetcopy == 0) { assert("porting::copyAssets unable to find copy assets method" == 0); } jnienv->CallVoidMethod(app_global->activity->clazz, assetcopy); } void initAndroid() { porting::jnienv = NULL; JavaVM *jvm = app_global->activity->vm; JavaVMAttachArgs lJavaVMAttachArgs; lJavaVMAttachArgs.version = JNI_VERSION_1_6; lJavaVMAttachArgs.name = PROJECT_NAME_C "NativeThread"; lJavaVMAttachArgs.group = NULL; #ifdef NDEBUG // This is a ugly hack as arm v7a non debuggable builds crash without this // printf ... if someone finds out why please fix it! infostream << "Attaching native thread. " << std::endl; #endif if ( jvm->AttachCurrentThread(&porting::jnienv, &lJavaVMAttachArgs) == JNI_ERR) { errorstream << "Failed to attach native thread to jvm" << std::endl; exit(-1); } nativeActivity = findClass("net/minetest/minetest/MtNativeActivity"); if (nativeActivity == 0) { errorstream << "porting::initAndroid unable to find java native activity class" << std::endl; } #ifdef GPROF /* in the start-up code */ __android_log_print(ANDROID_LOG_ERROR, PROJECT_NAME_C, "Initializing GPROF profiler"); monstartup("libminetest.so"); #endif } void cleanupAndroid() { #ifdef GPROF errorstream << "Shutting down GPROF profiler" << std::endl; setenv("CPUPROFILE", (path_user + DIR_DELIM + "gmon.out").c_str(), 1); moncleanup(); #endif JavaVM *jvm = app_global->activity->vm; jvm->DetachCurrentThread(); } static std::string javaStringToUTF8(jstring js) { std::string str; // Get string as a UTF-8 c-string const char *c_str = jnienv->GetStringUTFChars(js, NULL); // Save it str = c_str; // And free the c-string jnienv->ReleaseStringUTFChars(js, c_str); return str; } // Calls static method if obj is NULL static std::string getAndroidPath(jclass cls, jobject obj, jclass cls_File, jmethodID mt_getAbsPath, const char *getter) { // Get getter method jmethodID mt_getter; if (obj) mt_getter = jnienv->GetMethodID(cls, getter, "()Ljava/io/File;"); else mt_getter = jnienv->GetStaticMethodID(cls, getter, "()Ljava/io/File;"); // Call getter jobject ob_file; if (obj) ob_file = jnienv->CallObjectMethod(obj, mt_getter); else ob_file = jnienv->CallStaticObjectMethod(cls, mt_getter); // Call getAbsolutePath jstring js_path = (jstring) jnienv->CallObjectMethod(ob_file, mt_getAbsPath); return javaStringToUTF8(js_path); } void initializePathsAndroid() { // Get Environment class jclass cls_Env = jnienv->FindClass("android/os/Environment"); // Get File class jclass cls_File = jnienv->FindClass("java/io/File"); // Get getAbsolutePath method jmethodID mt_getAbsPath = jnienv->GetMethodID(cls_File, "getAbsolutePath", "()Ljava/lang/String;"); path_cache = getAndroidPath(nativeActivity, app_global->activity->clazz, cls_File, mt_getAbsPath, "getCacheDir"); path_storage = getAndroidPath(cls_Env, NULL, cls_File, mt_getAbsPath, "getExternalStorageDirectory"); path_user = path_storage + DIR_DELIM + PROJECT_NAME_C; path_share = path_storage + DIR_DELIM + PROJECT_NAME_C; migrateCachePath(); } void showInputDialog(const std::string& acceptButton, const std::string& hint, const std::string& current, int editType) { jmethodID showdialog = jnienv->GetMethodID(nativeActivity,"showDialog", "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)V"); if (showdialog == 0) { assert("porting::showInputDialog unable to find java show dialog method" == 0); } jstring jacceptButton = jnienv->NewStringUTF(acceptButton.c_str()); jstring jhint = jnienv->NewStringUTF(hint.c_str()); jstring jcurrent = jnienv->NewStringUTF(current.c_str()); jint jeditType = editType; jnienv->CallVoidMethod(app_global->activity->clazz, showdialog, jacceptButton, jhint, jcurrent, jeditType); } int getInputDialogState() { jmethodID dialogstate = jnienv->GetMethodID(nativeActivity, "getDialogState", "()I"); if (dialogstate == 0) { assert("porting::getInputDialogState unable to find java dialog state method" == 0); } return jnienv->CallIntMethod(app_global->activity->clazz, dialogstate); } std::string getInputDialogValue() { jmethodID dialogvalue = jnienv->GetMethodID(nativeActivity, "getDialogValue", "()Ljava/lang/String;"); if (dialogvalue == 0) { assert("porting::getInputDialogValue unable to find java dialog value method" == 0); } jobject result = jnienv->CallObjectMethod(app_global->activity->clazz, dialogvalue); const char* javachars = jnienv->GetStringUTFChars((jstring) result,0); std::string text(javachars); jnienv->ReleaseStringUTFChars((jstring) result, javachars); return text; } #ifndef SERVER float getDisplayDensity() { static bool firstrun = true; static float value = 0; if (firstrun) { jmethodID getDensity = jnienv->GetMethodID(nativeActivity, "getDensity", "()F"); if (getDensity == 0) { assert("porting::getDisplayDensity unable to find java getDensity method" == 0); } value = jnienv->CallFloatMethod(app_global->activity->clazz, getDensity); firstrun = false; } return value; } v2u32 getDisplaySize() { static bool firstrun = true; static v2u32 retval; if (firstrun) { jmethodID getDisplayWidth = jnienv->GetMethodID(nativeActivity, "getDisplayWidth", "()I"); if (getDisplayWidth == 0) { assert("porting::getDisplayWidth unable to find java getDisplayWidth method" == 0); } retval.X = jnienv->CallIntMethod(app_global->activity->clazz, getDisplayWidth); jmethodID getDisplayHeight = jnienv->GetMethodID(nativeActivity, "getDisplayHeight", "()I"); if (getDisplayHeight == 0) { assert("porting::getDisplayHeight unable to find java getDisplayHeight method" == 0); } retval.Y = jnienv->CallIntMethod(app_global->activity->clazz, getDisplayHeight); firstrun = false; } return retval; } #endif // ndef SERVER }