diff --git a/android/app-android.cpp b/android/app-android.cpp index dfe76f7123..8d9792dc90 100644 --- a/android/app-android.cpp +++ b/android/app-android.cpp @@ -52,29 +52,24 @@ void Vibrate(int length_ms) { frameCommandParam = "100"; } -void LaunchBrowser(const char *url) -{ +void LaunchBrowser(const char *url) { frameCommand = "launchBrowser"; frameCommandParam = url; } -void LaunchMarket(const char *url) -{ +void LaunchMarket(const char *url) { frameCommand = "launchMarket"; frameCommandParam = url; } -void LaunchEmail(const char *email_address) -{ +void LaunchEmail(const char *email_address) { frameCommand = "launchEmail"; frameCommandParam = email_address; } - // Remember that all of these need initialization on init! The process // may be reused when restarting the game. Globals are DANGEROUS. -// Used for touch. (TODO) float xscale = 1; float yscale = 1; @@ -84,6 +79,14 @@ static bool renderer_inited = false; static bool first_lost = true; static bool use_native_audio = false; +std::string GetJavaString(JNIEnv *env, jstring jstr) +{ + const char *str = env->GetStringUTFChars(jstr, 0); + std::string cpp_string = std::string(str); + env->ReleaseStringUTFChars(jstr, str); + return cpp_string; +} + extern "C" jboolean Java_com_turboviking_libnative_NativeApp_isLandscape(JNIEnv *env, jclass) { std::string app_name, app_nice_name; bool landscape; @@ -92,13 +95,19 @@ extern "C" jboolean Java_com_turboviking_libnative_NativeApp_isLandscape(JNIEnv } extern "C" void Java_com_turboviking_libnative_NativeApp_init - (JNIEnv *env, jclass, jint xxres, jint yyres, jstring apkpath, - jstring dataDir, jstring externalDir, jstring libraryDir, jstring jinstallID, jboolean juseNativeAudio) { + (JNIEnv *env, jclass, jint xxres, jint yyres, jint dpi, jstring japkpath, + jstring jdataDir, jstring jexternalDir, jstring jlibraryDir, jstring jinstallID, jboolean juseNativeAudio) { jniEnvUI = env; + pixel_xres = xxres; pixel_yres = yyres; - g_xres = xxres; - g_yres = yyres; + + g_dpi = dpi; + + // We default to 160 dpi and all our UI code is written to assume it. (DENSITY_MEDIUM). + g_xres = xxres * 160 / dpi; + g_yres = yyres * 160 / dpi; + use_native_audio = juseNativeAudio; if (g_xres < g_yres) { @@ -112,22 +121,16 @@ extern "C" void Java_com_turboviking_libnative_NativeApp_init renderer_inited = false; first_lost = true; - jboolean isCopy; - const char *str = env->GetStringUTFChars(apkpath, &isCopy); - ILOG("APK path: %s", str); - VFSRegister("", new ZipAssetReader(str, "assets/")); + std::string apkPath = GetJavaString(env, japkpath); + ILOG("APK path: %s", apkPath.c_str()); + VFSRegister("", new ZipAssetReader(apkPath.c_str(), "assets/")); - str = env->GetStringUTFChars(externalDir, &isCopy); - ILOG("External storage path: %s", str); + std::string externalDir = GetJavaString(env, jexternalDir); + std::string user_data_path = GetJavaString(env, jdataDir); + "/"; + std::string library_path = GetJavaString(env, jlibraryDir) + "/"; + std::string installID = GetJavaString(env, jinstallID); - str = env->GetStringUTFChars(dataDir, &isCopy); - std::string user_data_path = std::string(str) + "/"; - - str = env->GetStringUTFChars(libraryDir, &isCopy); - std::string library_path = std::string(str) + "/"; - - str = env->GetStringUTFChars(jinstallID, &isCopy); - std::string installID = std::string(str); + ILOG("External storage path: %s", externalDir.c_str()); std::string app_name; std::string app_nice_name; @@ -213,9 +216,9 @@ extern "C" void Java_com_turboviking_libnative_NativeRenderer_displayRender if (!frameCommand.empty()) { ILOG("frameCommand %s %s", frameCommand.c_str(), frameCommandParam.c_str()); + jstring cmd = env->NewStringUTF(frameCommand.c_str()); jstring param = env->NewStringUTF(frameCommandParam.c_str()); - env->CallVoidMethod(obj, postCommand, cmd, param); frameCommand = ""; @@ -239,8 +242,8 @@ extern "C" void Java_com_turboviking_libnative_NativeApp_audioRender(JNIEnv* en extern "C" void JNICALL Java_com_turboviking_libnative_NativeApp_touch (JNIEnv *, jclass, float x, float y, int code, int pointerId) { lock_guard guard(input_state.lock); - if (pointerId >= MAX_POINTERS) - { + + if (pointerId >= MAX_POINTERS) { ELOG("Too many pointers: %i", pointerId); return; // We ignore 8+ pointers entirely. } @@ -248,11 +251,9 @@ extern "C" void JNICALL Java_com_turboviking_libnative_NativeApp_touch input_state.mouse_x[pointerId] = (int)(x * xscale); input_state.mouse_y[pointerId] = (int)(y * yscale); if (code == 1) { - //ILOG("Down: %i %f %f", pointerId, x, y); input_state.mouse_last[pointerId] = input_state.mouse_down[pointerId]; input_state.mouse_down[pointerId] = true; } else if (code == 2) { - //ILOG("Up: %i %f %f", pointerId, x, y); input_state.mouse_last[pointerId] = input_state.mouse_down[pointerId]; input_state.mouse_down[pointerId] = false; } @@ -307,8 +308,8 @@ extern "C" void JNICALL Java_com_turboviking_libnative_NativeApp_accelerometer extern "C" void Java_com_turboviking_libnative_NativeApp_sendMessage (JNIEnv *env, jclass, jstring message, jstring param) { jboolean isCopy; - std::string msg(env->GetStringUTFChars(message, &isCopy)); - std::string prm(env->GetStringUTFChars(param, &isCopy)); + std::string msg = GetJavaString(env, message); + std::string prm = GetJavaString(env, param); ILOG("Message received: %s %s", msg.c_str(), prm.c_str()); } diff --git a/android/src/com/turboviking/libnative/NativeActivity.java b/android/src/com/turboviking/libnative/NativeActivity.java index 3e961769c8..065ed5544c 100644 --- a/android/src/com/turboviking/libnative/NativeActivity.java +++ b/android/src/com/turboviking/libnative/NativeActivity.java @@ -31,6 +31,7 @@ import android.opengl.GLSurfaceView; import android.os.Build; import android.os.Bundle; import android.os.Environment; +import android.util.DisplayMetrics; import android.util.Log; import android.view.Display; import android.view.KeyEvent; @@ -148,7 +149,11 @@ public class NativeActivity extends Activity { String dataDir = this.getFilesDir().getAbsolutePath(); String apkFilePath = appInfo.sourceDir; NativeApp.sendMessage("Message from Java", "Hot Coffee"); - NativeApp.init(scrWidth, scrHeight, apkFilePath, dataDir, externalStorageDir, libraryDir, installID, useOpenSL); + DisplayMetrics metrics = new DisplayMetrics(); + getWindowManager().getDefaultDisplay().getMetrics(metrics); + int dpi = metrics.densityDpi; + // INIT! + NativeApp.init(scrWidth, scrHeight, dpi, apkFilePath, dataDir, externalStorageDir, libraryDir, installID, useOpenSL); // Keep the screen bright - very annoying if it goes dark when tilting away Window window = this.getWindow(); diff --git a/android/src/com/turboviking/libnative/NativeApp.java b/android/src/com/turboviking/libnative/NativeApp.java index bb75a0603e..e7e0c32444 100644 --- a/android/src/com/turboviking/libnative/NativeApp.java +++ b/android/src/com/turboviking/libnative/NativeApp.java @@ -3,7 +3,7 @@ package com.turboviking.libnative; public class NativeApp { public static native boolean isLandscape(); public static native void init( - int xxres, int yyres, String apkPath, + int xxres, int yyres, int dpi, String apkPath, String dataDir, String externalDir, String libraryDir, String installID, boolean useOpenSL); // These have Android semantics: Resume is always called on bootup, after init diff --git a/base/PCMain.cpp b/base/PCMain.cpp index 84240f8f11..72d126fabc 100644 --- a/base/PCMain.cpp +++ b/base/PCMain.cpp @@ -128,7 +128,7 @@ int main(int argc, char *argv[]) { bool landscape; NativeGetAppInfo(&app_name, &app_name_nice, &landscape); - float zoom = 0.7f; + float zoom = 1.0f; const char *zoomenv = getenv("ZOOM"); if (zoomenv) { zoom = atof(zoomenv); @@ -137,6 +137,7 @@ int main(int argc, char *argv[]) { pixel_xres = 800 * zoom; pixel_yres = 480 * zoom; } else { + // PC development hack pixel_xres = 1580 * zoom; pixel_yres = 1000 * zoom; } diff --git a/base/display.cpp b/base/display.cpp index 5896c392f5..1ba39cb992 100644 --- a/base/display.cpp +++ b/base/display.cpp @@ -4,3 +4,5 @@ int g_xres; int g_yres; int pixel_xres; int pixel_yres; + +int g_dpi; \ No newline at end of file diff --git a/base/display.h b/base/display.h index 18e4920c71..ca561e7c63 100644 --- a/base/display.h +++ b/base/display.h @@ -7,3 +7,5 @@ extern int g_xres; extern int g_yres; extern int pixel_xres; extern int pixel_yres; + +extern int g_dpi; \ No newline at end of file diff --git a/native.vcxproj b/native.vcxproj index fbf66942d2..0402ee4795 100644 --- a/native.vcxproj +++ b/native.vcxproj @@ -92,6 +92,8 @@ + + @@ -154,6 +156,14 @@ true true + + true + true + + + true + true + diff --git a/native.vcxproj.filters b/native.vcxproj.filters index a27c2d5378..61af2a0391 100644 --- a/native.vcxproj.filters +++ b/native.vcxproj.filters @@ -175,6 +175,12 @@ net + + android + + + android + @@ -294,9 +300,6 @@ file - - base - util @@ -318,6 +321,15 @@ net + + android + + + android + + + android + @@ -371,5 +383,8 @@ {6a548b3d-3a4c-4114-aa2f-0b42bf7bf2ce} + + {b7bc9a09-29c1-447b-9255-fe0709d10689} + \ No newline at end of file