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