26#include <QtAndroidExtras/QAndroidJniObject>
33#include <wx/tokenzr.h>
35#include "android_jvm.h"
37extern int g_Android_SDK_Version;
39bool CheckPendingJNIException() {
42 if (java_vm->GetEnv((
void **)&jenv, JNI_VERSION_1_6) != JNI_OK)
return true;
44 if ((jenv)->ExceptionCheck() == JNI_TRUE) {
46 (jenv)->ExceptionDescribe();
47 (jenv)->ExceptionClear();
57wxString callActivityMethod_s4s(
const char *method, wxString parm1,
58 wxString parm2, wxString parm3,
60 if (CheckPendingJNIException())
return _T(
"NOK");
63 wxString return_string;
64 QAndroidJniObject activity = QAndroidJniObject::callStaticObjectMethod(
65 "org/qtproject/qt5/android/QtNative",
"activity",
66 "()Landroid/app/Activity;");
67 if (CheckPendingJNIException())
return _T(
"NOK");
69 if (!activity.isValid()) {
75 if (java_vm->GetEnv((
void **)&jenv, JNI_VERSION_1_6) != JNI_OK) {
77 return _T(
"jenv Error");
80 wxCharBuffer p1b = parm1.ToUTF8();
81 jstring p1 = (jenv)->NewStringUTF(p1b.data());
83 wxCharBuffer p2b = parm2.ToUTF8();
84 jstring p2 = (jenv)->NewStringUTF(p2b.data());
86 wxCharBuffer p3b = parm3.ToUTF8();
87 jstring p3 = (jenv)->NewStringUTF(p3b.data());
89 wxCharBuffer p4b = parm4.ToUTF8();
90 jstring p4 = (jenv)->NewStringUTF(p4b.data());
98 QAndroidJniObject data = activity.callObjectMethod(
100 "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/"
101 "String;)Ljava/lang/String;",
103 (jenv)->DeleteLocalRef(p1);
104 (jenv)->DeleteLocalRef(p2);
105 (jenv)->DeleteLocalRef(p3);
106 (jenv)->DeleteLocalRef(p4);
108 if (CheckPendingJNIException())
return _T(
"NOK");
112 jstring s = data.object<jstring>();
114 if ((jenv)->GetStringLength(s)) {
115 const char *ret_string = (jenv)->GetStringUTFChars(s, NULL);
116 return_string = wxString(ret_string, wxConvUTF8);
119 return return_string;
122wxString callActivityMethod_ss(
const char *method, wxString parm) {
123 if (CheckPendingJNIException())
return _T(
"NOK");
126 wxString return_string;
127 QAndroidJniObject activity = QAndroidJniObject::callStaticObjectMethod(
128 "org/qtproject/qt5/android/QtNative",
"activity",
129 "()Landroid/app/Activity;");
130 if (CheckPendingJNIException())
return _T(
"NOK");
132 if (!activity.isValid()) {
134 return return_string;
138 if (java_vm->GetEnv((
void **)&jenv, JNI_VERSION_1_6) != JNI_OK) {
140 return _T(
"jenv Error");
143 jstring p = (jenv)->NewStringUTF(parm.c_str());
149 QAndroidJniObject data = activity.callObjectMethod(
150 method,
"(Ljava/lang/String;)Ljava/lang/String;", p);
152 (jenv)->DeleteLocalRef(p);
154 if (CheckPendingJNIException())
return _T(
"NOK");
158 jstring s = data.object<jstring>();
160 if ((jenv)->GetStringLength(s)) {
161 const char *ret_string = (jenv)->GetStringUTFChars(s, NULL);
162 return_string = wxString(ret_string, wxConvUTF8);
165 return return_string;
168wxString callActivityMethod_vs(
const char *method) {
169 if (CheckPendingJNIException())
return _T(
"NOK");
173 wxString return_string;
174 QAndroidJniObject activity = QAndroidJniObject::callStaticObjectMethod(
175 "org/qtproject/qt5/android/QtNative",
"activity",
176 "()Landroid/app/Activity;");
177 if (CheckPendingJNIException())
return _T(
"NOK");
179 if (!activity.isValid()) {
181 return return_string;
185 QAndroidJniObject data =
186 activity.callObjectMethod(method,
"()Ljava/lang/String;");
187 if (CheckPendingJNIException())
return _T(
"NOK");
189 jstring s = data.object<jstring>();
193 if (java_vm->GetEnv((
void **)&jenv, JNI_VERSION_1_6) != JNI_OK) {
196 const char *ret_string = (jenv)->GetStringUTFChars(s, NULL);
197 return_string = wxString(ret_string, wxConvUTF8);
201 return return_string;
204wxString callActivityMethod_s2s(
const char *method, wxString parm1,
206 if (CheckPendingJNIException())
return _T(
"NOK");
209 wxString return_string;
210 QAndroidJniObject activity = QAndroidJniObject::callStaticObjectMethod(
211 "org/qtproject/qt5/android/QtNative",
"activity",
212 "()Landroid/app/Activity;");
213 if (CheckPendingJNIException())
return _T(
"NOK");
215 if (!activity.isValid()) {
217 return return_string;
221 if (java_vm->GetEnv((
void **)&jenv, JNI_VERSION_1_6) != JNI_OK) {
223 return _T(
"jenv Error");
226 jstring p1 = (jenv)->NewStringUTF(parm1.c_str());
227 jstring p2 = (jenv)->NewStringUTF(parm2.c_str());
232 QAndroidJniObject data = activity.callObjectMethod(
233 method,
"(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;", p1,
236 (jenv)->DeleteLocalRef(p1);
237 (jenv)->DeleteLocalRef(p2);
239 if (CheckPendingJNIException())
return _T(
"NOK");
243 jstring s = data.object<jstring>();
245 if ((jenv)->GetStringLength(s)) {
246 const char *ret_string = (jenv)->GetStringUTFChars(s, NULL);
247 return_string = wxString(ret_string, wxConvUTF8);
250 return return_string;
253bool AndroidUnzip(wxString zipFile, wxString destDir,
int nStrip,
255 qDebug() <<
"AndroidUnzip" << zipFile.mb_str() << destDir.mb_str();
258 ns.Printf(_T(
"%d"), nStrip);
260 wxString br = _T(
"0");
261 if (bRemoveZip) br = _T(
"1");
263 qDebug() <<
"br" << br.mb_str();
265 wxString stat = callActivityMethod_s4s(
"unzipFile", zipFile, destDir, ns, br);
267 if (wxNOT_FOUND == stat.Find(_T(
"OK")))
return false;
269 qDebug() <<
"unzip start";
276 qDebug() <<
"unzip poll";
278 wxString result = callActivityMethod_ss(
"getUnzipStatus", _T(
""));
279 if (wxNOT_FOUND != result.Find(_T(
"DONE"))) bDone =
true;
281 qDebug() <<
"unzip done";
286wxString AndroidGetCacheDir() {
287 wxString dirs = callActivityMethod_vs(
"getSystemDirs");
288 qDebug() <<
"dirs: " << dirs.mb_str();
292 wxStringTokenizer tk(dirs, _T(
";"));
293 if (tk.HasMoreTokens()) {
294 wxString token = tk.GetNextToken();
298 token = tk.GetNextToken();
300 token = tk.GetNextToken();
302 token = tk.GetNextToken();
308 token = tk.GetNextToken();
318bool AndroidSecureCopyFile(wxString in, wxString out) {
321 wxString result = callActivityMethod_s2s(
"SecureFileCopy", in, out);
323 if (wxNOT_FOUND == result.Find(_T(
"OK"))) bret =
false;
328bool b_androidBusyShown;
329void androidShowBusyIcon() {
330 if (b_androidBusyShown)
return;
335 QAndroidJniObject activity = QAndroidJniObject::callStaticObjectMethod(
336 "org/qtproject/qt5/android/QtNative",
"activity",
337 "()Landroid/app/Activity;");
338 if (!activity.isValid()) {
344 QAndroidJniObject data =
345 activity.callObjectMethod(
"showBusyCircle",
"()Ljava/lang/String;");
347 b_androidBusyShown =
true;
350void androidHideBusyIcon() {
351 if (!b_androidBusyShown)
return;
354 QAndroidJniObject activity = QAndroidJniObject::callStaticObjectMethod(
355 "org/qtproject/qt5/android/QtNative",
"activity",
356 "()Landroid/app/Activity;");
358 if (!activity.isValid()) {
364 QAndroidJniObject data =
365 activity.callObjectMethod(
"hideBusyCircle",
"()Ljava/lang/String;");
367 b_androidBusyShown =
false;
370void androidEnableRotation(
void) { callActivityMethod_vs(
"EnableRotation"); }
372void androidDisableRotation(
void) { callActivityMethod_vs(
"DisableRotation"); }
374int androidGetSDKVersion() {
375 wxString deviceInfo = callActivityMethod_vs(
"getDeviceInfo");
376 wxStringTokenizer tkz(deviceInfo, _T(
"\n"));
377 while (tkz.HasMoreTokens()) {
378 wxString s1 = tkz.GetNextToken();
379 if (wxNOT_FOUND != s1.Find(_T(
"OS API Level"))) {
380 int a = s1.Find(_T(
"{"));
381 if (wxNOT_FOUND != a) {
382 wxString b = s1.Mid(a + 1, 2);
385 g_Android_SDK_Version = SDK;
389 return g_Android_SDK_Version;
OpenCPN Android support utilities.