void AndroidSystem::initialise (JNIEnv* env, jobject act, jstring file, jstring dataDir) { screenWidth = screenHeight = 0; dpi = 160; JNIClassBase::initialiseAllClasses (env); activity = GlobalRef (act); appFile = juceString (env, file); appDataDir = juceString (env, dataDir); }
void AndroidSystem::initialise (JNIEnv* env, jobject act, jstring file, jstring dataDir) { screenWidth = screenHeight = 0; dpi = 160; JNIClassBase::initialiseAllClasses (env); threadLocalJNIEnvHolder.initialise (env); #if JUCE_DEBUG systemInitialised = true; #endif activity = GlobalRef (act); appFile = juceString (env, file); appDataDir = juceString (env, dataDir); }
static StringArray getBluetoothMidiDevicesNearby() { StringArray retval; JNIEnv* env = getEnv(); LocalRef<jobject> btManager (android.activity.callObjectMethod (JuceAppActivity.getAndroidBluetoothManager)); // if this is null then bluetooth is not enabled if (btManager.get() == nullptr) return StringArray(); jobjectArray jDevices = (jobjectArray) env->CallObjectMethod (btManager.get(), AndroidBluetoothManager.getMidiBluetoothAddresses); LocalRef<jobjectArray> devices (jDevices); const int count = env->GetArrayLength (devices.get()); for (int i = 0; i < count; ++i) { LocalRef<jstring> string ((jstring) env->GetObjectArrayElement (devices.get(), i)); retval.add (juceString (string)); } return retval; }
//============================================================================== static String audioManagerGetProperty (const String& property) { const LocalRef<jstring> jProperty (javaString (property)); const LocalRef<jstring> text ((jstring) android.activity.callObjectMethod (JuceAppActivity.audioManagerGetProperty, jProperty.get())); if (text.get() != 0) return juceString (text); return String(); }
WebInputStream (String address, bool isPost, const MemoryBlock& postData, URL::OpenStreamProgressCallback* progressCallback, void* progressCallbackContext, const String& headers, int timeOutMs, StringPairArray* responseHeaders) { if (! address.contains ("://")) address = "http://" + address; JNIEnv* env = getEnv(); jbyteArray postDataArray = 0; if (postData.getSize() > 0) { postDataArray = env->NewByteArray (postData.getSize()); env->SetByteArrayRegion (postDataArray, 0, postData.getSize(), (const jbyte*) postData.getData()); } LocalRef<jobject> responseHeaderBuffer (env->NewObject (StringBuffer, StringBuffer.constructor)); stream = GlobalRef (env->CallStaticObjectMethod (JuceAppActivity, JuceAppActivity.createHTTPStream, javaString (address).get(), (jboolean) isPost, postDataArray, javaString (headers).get(), (jint) timeOutMs, responseHeaderBuffer.get())); if (postDataArray != 0) env->DeleteLocalRef (postDataArray); if (stream != 0) { StringArray headerLines; { LocalRef<jstring> headersString ((jstring) env->CallObjectMethod (responseHeaderBuffer.get(), StringBuffer.toString)); headerLines.addLines (juceString (env, headersString)); } if (responseHeaders != 0) { for (int i = 0; i < headerLines.size(); ++i) { const String& header = headerLines[i]; const String key (header.upToFirstOccurrenceOf (": ", false, false)); const String value (header.fromFirstOccurrenceOf (": ", false, false)); const String previousValue ((*responseHeaders) [key]); responseHeaders->set (key, previousValue.isEmpty() ? value : (previousValue + "," + value)); } } } }
//============================================================================== static String getHumanReadableStringForBluetoothAddress (const String& address) { JNIEnv* env = getEnv(); LocalRef<jobject> btManager (android.activity.callObjectMethod (JuceAppActivity.getAndroidBluetoothManager)); if (btManager.get() == nullptr) return address; LocalRef<jstring> string ((jstring) env->CallObjectMethod (btManager.get(), AndroidBluetoothManager.getHumanReadableStringForBluetoothAddress, javaString (address).get())); if (string.get() == nullptr) return address; return juceString (string); }
jobject invoke (jobject proxy, jobject method, jobjectArray args) override { auto* env = getEnv(); auto methodName = juceString ((jstring) env->CallObjectMethod (method, Method.getName)); if (methodName == "onMediaScannerConnected") { onMediaScannerConnected(); return nullptr; } else if (methodName == "onScanCompleted") { onScanCompleted(); return nullptr; } return AndroidInterfaceImplementer::invoke (proxy, method, args); }
static File getSpecialFile (jmethodID type) { return File (juceString (LocalRef<jstring> ((jstring) getEnv()->CallStaticObjectMethod (JuceAppActivity, type)))); }
String getAndroidOsBuildValue (const char* fieldName) { return juceString (LocalRef<jstring> ((jstring) getEnv()->GetStaticObjectField ( BuildClass, getEnv()->GetStaticFieldID (BuildClass, fieldName, "Ljava/lang/String;")))); }
String getLocaleValue (bool isRegion) { return juceString (LocalRef<jstring> ((jstring) getEnv()->CallStaticObjectMethod (JuceAppActivity, JuceAppActivity.getLocaleValue, isRegion))); }
String getSystemProperty (const String& name) { return juceString (LocalRef<jstring> ((jstring) getEnv()->CallStaticObjectMethod (SystemClass, SystemClass.getProperty, javaString (name).get()))); }
WebInputStream (String address, bool isPost, const MemoryBlock& postData, URL::OpenStreamProgressCallback* progressCallback, void* progressCallbackContext, const String& headers, int timeOutMs, StringPairArray* responseHeaders) : statusCode (0) { if (! address.contains ("://")) address = "http://" + address; JNIEnv* env = getEnv(); jbyteArray postDataArray = 0; if (postData.getSize() > 0) { postDataArray = env->NewByteArray (postData.getSize()); env->SetByteArrayRegion (postDataArray, 0, postData.getSize(), (const jbyte*) postData.getData()); } LocalRef<jobject> responseHeaderBuffer (env->NewObject (StringBuffer, StringBuffer.constructor)); // Annoyingly, the android HTTP functions will choke on this call if you try to do it on the message // thread. You'll need to move your networking code to a background thread to keep it happy.. jassert (Thread::getCurrentThread() != nullptr); jintArray statusCodeArray = env->NewIntArray (1); jassert (statusCodeArray != 0); stream = GlobalRef (env->CallStaticObjectMethod (JuceAppActivity, JuceAppActivity.createHTTPStream, javaString (address).get(), (jboolean) isPost, postDataArray, javaString (headers).get(), (jint) timeOutMs, statusCodeArray, responseHeaderBuffer.get())); jint* const statusCodeElements = env->GetIntArrayElements (statusCodeArray, 0); statusCode = statusCodeElements[0]; env->ReleaseIntArrayElements (statusCodeArray, statusCodeElements, 0); env->DeleteLocalRef (statusCodeArray); if (postDataArray != 0) env->DeleteLocalRef (postDataArray); if (stream != 0) { StringArray headerLines; { LocalRef<jstring> headersString ((jstring) env->CallObjectMethod (responseHeaderBuffer.get(), StringBuffer.toString)); headerLines.addLines (juceString (env, headersString)); } if (responseHeaders != 0) { for (int i = 0; i < headerLines.size(); ++i) { const String& header = headerLines[i]; const String key (header.upToFirstOccurrenceOf (": ", false, false)); const String value (header.fromFirstOccurrenceOf (": ", false, false)); const String previousValue ((*responseHeaders) [key]); responseHeaders->set (key, previousValue.isEmpty() ? value : (previousValue + "," + value)); } } } }