32#include "androidSupport.h"
33#include "android_jvm.h"
34#include <wx/tokenzr.h>
36#include <QtAndroidExtras/QAndroidJniObject>
39extern int g_Android_SDK_Version;
41bool CheckPendingJNIException() {
44 if (java_vm->GetEnv((
void **)&jenv, JNI_VERSION_1_6) != JNI_OK)
return true;
46 if ((jenv)->ExceptionCheck() == JNI_TRUE) {
48 (jenv)->ExceptionDescribe();
49 (jenv)->ExceptionClear();
59wxString callActivityMethod_s4s(
const char *method, wxString parm1,
60 wxString parm2, wxString parm3,
62 if (CheckPendingJNIException())
return _T(
"NOK");
65 wxString return_string;
66 QAndroidJniObject activity = QAndroidJniObject::callStaticObjectMethod(
67 "org/qtproject/qt5/android/QtNative",
"activity",
68 "()Landroid/app/Activity;");
69 if (CheckPendingJNIException())
return _T(
"NOK");
71 if (!activity.isValid()) {
77 if (java_vm->GetEnv((
void **)&jenv, JNI_VERSION_1_6) != JNI_OK) {
79 return _T(
"jenv Error");
82 wxCharBuffer p1b = parm1.ToUTF8();
83 jstring p1 = (jenv)->NewStringUTF(p1b.data());
85 wxCharBuffer p2b = parm2.ToUTF8();
86 jstring p2 = (jenv)->NewStringUTF(p2b.data());
88 wxCharBuffer p3b = parm3.ToUTF8();
89 jstring p3 = (jenv)->NewStringUTF(p3b.data());
91 wxCharBuffer p4b = parm4.ToUTF8();
92 jstring p4 = (jenv)->NewStringUTF(p4b.data());
100 QAndroidJniObject data = activity.callObjectMethod(
102 "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/"
103 "String;)Ljava/lang/String;",
105 (jenv)->DeleteLocalRef(p1);
106 (jenv)->DeleteLocalRef(p2);
107 (jenv)->DeleteLocalRef(p3);
108 (jenv)->DeleteLocalRef(p4);
110 if (CheckPendingJNIException())
return _T(
"NOK");
114 jstring s = data.object<jstring>();
116 if ((jenv)->GetStringLength(s)) {
117 const char *ret_string = (jenv)->GetStringUTFChars(s, NULL);
118 return_string = wxString(ret_string, wxConvUTF8);
121 return return_string;
124wxString callActivityMethod_ss(
const char *method, wxString parm) {
125 if (CheckPendingJNIException())
return _T(
"NOK");
128 wxString return_string;
129 QAndroidJniObject activity = QAndroidJniObject::callStaticObjectMethod(
130 "org/qtproject/qt5/android/QtNative",
"activity",
131 "()Landroid/app/Activity;");
132 if (CheckPendingJNIException())
return _T(
"NOK");
134 if (!activity.isValid()) {
136 return return_string;
140 if (java_vm->GetEnv((
void **)&jenv, JNI_VERSION_1_6) != JNI_OK) {
142 return _T(
"jenv Error");
145 jstring p = (jenv)->NewStringUTF(parm.c_str());
151 QAndroidJniObject data = activity.callObjectMethod(
152 method,
"(Ljava/lang/String;)Ljava/lang/String;", p);
154 (jenv)->DeleteLocalRef(p);
156 if (CheckPendingJNIException())
return _T(
"NOK");
160 jstring s = data.object<jstring>();
162 if ((jenv)->GetStringLength(s)) {
163 const char *ret_string = (jenv)->GetStringUTFChars(s, NULL);
164 return_string = wxString(ret_string, wxConvUTF8);
167 return return_string;
170wxString callActivityMethod_vs(
const char *method) {
171 if (CheckPendingJNIException())
return _T(
"NOK");
175 wxString return_string;
176 QAndroidJniObject activity = QAndroidJniObject::callStaticObjectMethod(
177 "org/qtproject/qt5/android/QtNative",
"activity",
178 "()Landroid/app/Activity;");
179 if (CheckPendingJNIException())
return _T(
"NOK");
181 if (!activity.isValid()) {
183 return return_string;
187 QAndroidJniObject data =
188 activity.callObjectMethod(method,
"()Ljava/lang/String;");
189 if (CheckPendingJNIException())
return _T(
"NOK");
191 jstring s = data.object<jstring>();
195 if (java_vm->GetEnv((
void **)&jenv, JNI_VERSION_1_6) != JNI_OK) {
198 const char *ret_string = (jenv)->GetStringUTFChars(s, NULL);
199 return_string = wxString(ret_string, wxConvUTF8);
203 return return_string;
206wxString callActivityMethod_s2s(
const char *method, wxString parm1,
208 if (CheckPendingJNIException())
return _T(
"NOK");
211 wxString return_string;
212 QAndroidJniObject activity = QAndroidJniObject::callStaticObjectMethod(
213 "org/qtproject/qt5/android/QtNative",
"activity",
214 "()Landroid/app/Activity;");
215 if (CheckPendingJNIException())
return _T(
"NOK");
217 if (!activity.isValid()) {
219 return return_string;
223 if (java_vm->GetEnv((
void **)&jenv, JNI_VERSION_1_6) != JNI_OK) {
225 return _T(
"jenv Error");
228 jstring p1 = (jenv)->NewStringUTF(parm1.c_str());
229 jstring p2 = (jenv)->NewStringUTF(parm2.c_str());
234 QAndroidJniObject data = activity.callObjectMethod(
235 method,
"(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;", p1,
238 (jenv)->DeleteLocalRef(p1);
239 (jenv)->DeleteLocalRef(p2);
241 if (CheckPendingJNIException())
return _T(
"NOK");
245 jstring s = data.object<jstring>();
247 if ((jenv)->GetStringLength(s)) {
248 const char *ret_string = (jenv)->GetStringUTFChars(s, NULL);
249 return_string = wxString(ret_string, wxConvUTF8);
252 return return_string;
255bool AndroidUnzip(wxString zipFile, wxString destDir,
int nStrip,
257 qDebug() <<
"AndroidUnzip" << zipFile.mb_str() << destDir.mb_str();
260 ns.Printf(_T(
"%d"), nStrip);
262 wxString br = _T(
"0");
263 if (bRemoveZip) br = _T(
"1");
265 qDebug() <<
"br" << br.mb_str();
267 wxString stat = callActivityMethod_s4s(
"unzipFile", zipFile, destDir, ns, br);
269 if (wxNOT_FOUND == stat.Find(_T(
"OK")))
return false;
271 qDebug() <<
"unzip start";
278 qDebug() <<
"unzip poll";
280 wxString result = callActivityMethod_ss(
"getUnzipStatus", _T(
""));
281 if (wxNOT_FOUND != result.Find(_T(
"DONE"))) bDone =
true;
283 qDebug() <<
"unzip done";
288wxString AndroidGetCacheDir() {
289 wxString dirs = callActivityMethod_vs(
"getSystemDirs");
290 qDebug() <<
"dirs: " << dirs.mb_str();
294 wxStringTokenizer tk(dirs, _T(
";"));
295 if (tk.HasMoreTokens()) {
296 wxString token = tk.GetNextToken();
300 token = tk.GetNextToken();
302 token = tk.GetNextToken();
304 token = tk.GetNextToken();
310 token = tk.GetNextToken();
320bool AndroidSecureCopyFile(wxString in, wxString out) {
323 wxString result = callActivityMethod_s2s(
"SecureFileCopy", in, out);
325 if (wxNOT_FOUND == result.Find(_T(
"OK"))) bret =
false;
330bool b_androidBusyShown;
331void androidShowBusyIcon() {
332 if (b_androidBusyShown)
return;
337 QAndroidJniObject activity = QAndroidJniObject::callStaticObjectMethod(
338 "org/qtproject/qt5/android/QtNative",
"activity",
339 "()Landroid/app/Activity;");
340 if (!activity.isValid()) {
346 QAndroidJniObject data =
347 activity.callObjectMethod(
"showBusyCircle",
"()Ljava/lang/String;");
349 b_androidBusyShown =
true;
352void androidHideBusyIcon() {
353 if (!b_androidBusyShown)
return;
356 QAndroidJniObject activity = QAndroidJniObject::callStaticObjectMethod(
357 "org/qtproject/qt5/android/QtNative",
"activity",
358 "()Landroid/app/Activity;");
360 if (!activity.isValid()) {
366 QAndroidJniObject data =
367 activity.callObjectMethod(
"hideBusyCircle",
"()Ljava/lang/String;");
369 b_androidBusyShown =
false;
372void androidEnableRotation(
void) { callActivityMethod_vs(
"EnableRotation"); }
374void androidDisableRotation(
void) { callActivityMethod_vs(
"DisableRotation"); }
376int androidGetSDKVersion() {
377 wxString deviceInfo = callActivityMethod_vs(
"getDeviceInfo");
378 wxStringTokenizer tkz(deviceInfo, _T(
"\n"));
379 while (tkz.HasMoreTokens()) {
380 wxString s1 = tkz.GetNextToken();
381 if (wxNOT_FOUND != s1.Find(_T(
"OS API Level"))) {
382 int a = s1.Find(_T(
"{"));
383 if (wxNOT_FOUND != a) {
384 wxString b = s1.Mid(a + 1, 2);
387 g_Android_SDK_Version = SDK;
391 return g_Android_SDK_Version;