static void unpairBluetoothMidiDevice (const String& bluetoothAddress) { JNIEnv* env = getEnv(); LocalRef<jobject> btManager (android.activity.callObjectMethod (JuceAppActivity.getAndroidBluetoothManager)); if (btManager.get() != nullptr) env->CallVoidMethod (btManager.get(), AndroidBluetoothManager.unpairBluetoothMidiDevice, javaString (bluetoothAddress).get()); }
void jniExceptionCheck(JNIEnv * env) { if (!env) { abort(); } const LocalRef<jthrowable> e(env->ExceptionOccurred()); if (e) { env->ExceptionClear(); jniThrowCppFromJavaException(env, e.get()); } }
//============================================================================== 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 (BeastAppActivity, BeastAppActivity.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 (beastString (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 bool isBluetoothDevicePaired (const String& address) { JNIEnv* env = getEnv(); LocalRef<jobject> btManager (android.activity.callObjectMethod (JuceAppActivity.getAndroidBluetoothManager)); if (btManager.get() == nullptr) return false; return env->CallBooleanMethod (btManager.get(), AndroidBluetoothManager.isBluetoothDevicePaired, javaString (address).get()); }
//============================================================================== static bool pairBluetoothMidiDevice (const String& bluetoothAddress) { JNIEnv* env = getEnv(); LocalRef<jobject> btManager (android.activity.callObjectMethod (JuceAppActivity.getAndroidBluetoothManager)); if (btManager.get() == nullptr) return false; jboolean result = env->CallBooleanMethod (btManager.get(), AndroidBluetoothManager.pairBluetoothMidiDevice, javaString (bluetoothAddress).get()); return result; }
//============================================================================== 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); }
void append(const boost::posix_time::ptime ×tamp, const Log::Level level, const std::string &position, const std::string &message) { const boost::optional<Context::Handle> ctx = Context::getContextOptional(); if (ctx) { const ::tm tm = boost::posix_time::to_tm(timestamp); LocalRef<jobject> localDateTime = localDateTimeClass_.callStaticObjectMethod( localDateTimeOfId_, tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday, tm.tm_hour, tm.tm_min, tm.tm_sec); LocalRef<jobject> lvl( logLevelClass_.newEnumByOrdinal(static_cast<jint>(level))); LocalRef<jobject> pos(newStringUTF(position)); LocalRef<jobject> msg(newStringUTF(message)); ctx.get()->env()->CallVoidMethod(log_.get(), appendId_, localDateTime.get(), lvl.get(), pos.get(), msg.get()); ctx.get()->throwIfOccured(); } }
AndroidTypeface (const void* data, size_t size) : Typeface (String(), String()) { JNIEnv* const env = getEnv(); LocalRef<jbyteArray> bytes (env->NewByteArray (size)); env->SetByteArrayRegion (bytes, 0, size, (const jbyte*) data); typeface = GlobalRef (android.activity.callObjectMethod (JuceAppActivity.getTypeFaceFromByteArray, bytes.get())); initialise (env); }
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; }
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)); } } } }