summaryrefslogtreecommitdiffstats
path: root/media/jni/android_media_MtpClient.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'media/jni/android_media_MtpClient.cpp')
-rw-r--r--media/jni/android_media_MtpClient.cpp120
1 files changed, 35 insertions, 85 deletions
diff --git a/media/jni/android_media_MtpClient.cpp b/media/jni/android_media_MtpClient.cpp
index 2328889..5c397a6 100644
--- a/media/jni/android_media_MtpClient.cpp
+++ b/media/jni/android_media_MtpClient.cpp
@@ -22,7 +22,6 @@
#include <limits.h>
#include <unistd.h>
#include <fcntl.h>
-#include <utils/threads.h>
#include "jni.h"
#include "JNIHelp.h"
@@ -39,34 +38,25 @@ static jmethodID method_deviceAdded;
static jmethodID method_deviceRemoved;
static jfieldID field_context;
+static void checkAndClearExceptionFromCallback(JNIEnv* env, const char* methodName) {
+ if (env->ExceptionCheck()) {
+ LOGE("An exception was thrown by callback '%s'.", methodName);
+ LOGE_EX(env);
+ env->ExceptionClear();
+ }
+}
+
class MyClient : public MtpClient {
private:
-
- enum {
- kDeviceAdded = 1,
- kDeviceRemoved,
- };
-
virtual void deviceAdded(MtpDevice *device);
virtual void deviceRemoved(MtpDevice *device);
- bool reportDeviceAdded(JNIEnv *env, MtpDevice *device);
- bool reportDeviceRemoved(JNIEnv *env, MtpDevice *device);
-
- JNIEnv* mEnv;
jobject mClient;
- Mutex mEventLock;
- Condition mEventCondition;
- Mutex mAckLock;
- Condition mAckCondition;
- int mEvent;
MtpDevice* mEventDevice;
public:
MyClient(JNIEnv *env, jobject client);
- virtual ~MyClient();
- void waitForEvent(JNIEnv *env);
-
+ void cleanup(JNIEnv *env);
};
MtpClient* get_client_from_object(JNIEnv* env, jobject javaClient)
@@ -76,87 +66,36 @@ MtpClient* get_client_from_object(JNIEnv* env, jobject javaClient)
MyClient::MyClient(JNIEnv *env, jobject client)
- : mEnv(env),
- mClient(env->NewGlobalRef(client)),
- mEvent(0),
- mEventDevice(NULL)
+ : mClient(env->NewGlobalRef(client))
{
}
-MyClient::~MyClient() {
- mEnv->DeleteGlobalRef(mClient);
+void MyClient::cleanup(JNIEnv *env) {
+ env->DeleteGlobalRef(mClient);
}
-
void MyClient::deviceAdded(MtpDevice *device) {
- LOGD("MyClient::deviceAdded\n");
- mAckLock.lock();
- mEventLock.lock();
- mEvent = kDeviceAdded;
- mEventDevice = device;
- mEventCondition.signal();
- mEventLock.unlock();
- mAckCondition.wait(mAckLock);
- mAckLock.unlock();
-}
-
-void MyClient::deviceRemoved(MtpDevice *device) {
- LOGD("MyClient::deviceRemoved\n");
- mAckLock.lock();
- mEventLock.lock();
- mEvent = kDeviceRemoved;
- mEventDevice = device;
- mEventCondition.signal();
- mEventLock.unlock();
- mAckCondition.wait(mAckLock);
- mAckLock.unlock();
-}
-
-bool MyClient::reportDeviceAdded(JNIEnv *env, MtpDevice *device) {
+ JNIEnv* env = AndroidRuntime::getJNIEnv();
const char* name = device->getDeviceName();
- LOGD("MyClient::reportDeviceAdded %s\n", name);
+ LOGD("MyClient::deviceAdded %s\n", name);
env->CallVoidMethod(mClient, method_deviceAdded, device->getID());
- return (!env->ExceptionCheck());
+ checkAndClearExceptionFromCallback(env, __FUNCTION__);
}
-bool MyClient::reportDeviceRemoved(JNIEnv *env, MtpDevice *device) {
- const char* name = device->getDeviceName();
- LOGD("MyClient::reportDeviceRemoved %s\n", name);
+void MyClient::deviceRemoved(MtpDevice *device) {
+ JNIEnv* env = AndroidRuntime::getJNIEnv();
+ const char* name = device->getDeviceName();
+ LOGD("MyClient::deviceRemoved %s\n", name);
env->CallVoidMethod(mClient, method_deviceRemoved, device->getID());
- return (!env->ExceptionCheck());
+ checkAndClearExceptionFromCallback(env, __FUNCTION__);
}
-void MyClient::waitForEvent(JNIEnv *env) {
- mEventLock.lock();
- mEventCondition.wait(mEventLock);
- mEventLock.unlock();
-
- switch (mEvent) {
- case kDeviceAdded:
- reportDeviceAdded(env, mEventDevice);
- break;
- case kDeviceRemoved:
- reportDeviceRemoved(env, mEventDevice);
- break;
- }
-
- mAckLock.lock();
- mAckCondition.signal();
- mAckLock.unlock();
-}
-
-
// ----------------------------------------------------------------------------
-static bool ExceptionCheck(void* env)
-{
- return ((JNIEnv *)env)->ExceptionCheck();
-}
-
static void
android_media_MtpClient_setup(JNIEnv *env, jobject thiz)
{
@@ -171,15 +110,25 @@ android_media_MtpClient_finalize(JNIEnv *env, jobject thiz)
{
LOGD("finalize\n");
MyClient *client = (MyClient *)env->GetIntField(thiz, field_context);
+ client->cleanup(env);
delete client;
+ env->SetIntField(thiz, field_context, 0);
+}
+
+static jboolean
+android_media_MtpClient_start(JNIEnv *env, jobject thiz)
+{
+ LOGD("start\n");
+ MyClient *client = (MyClient *)env->GetIntField(thiz, field_context);
+ return client->start();
}
static void
-android_media_MtpClient_wait_for_event(JNIEnv *env, jobject thiz)
+android_media_MtpClient_stop(JNIEnv *env, jobject thiz)
{
- LOGD("wait_for_event\n");
+ LOGD("stop\n");
MyClient *client = (MyClient *)env->GetIntField(thiz, field_context);
- client->waitForEvent(env);
+ client->stop();
}
static jboolean
@@ -223,7 +172,8 @@ android_media_MtpClient_get_storage_id(JNIEnv *env, jobject thiz,
static JNINativeMethod gMethods[] = {
{"native_setup", "()V", (void *)android_media_MtpClient_setup},
{"native_finalize", "()V", (void *)android_media_MtpClient_finalize},
- {"native_wait_for_event", "()V", (void *)android_media_MtpClient_wait_for_event},
+ {"native_start", "()Z", (void *)android_media_MtpClient_start},
+ {"native_stop", "()V", (void *)android_media_MtpClient_stop},
{"native_delete_object", "(II)Z", (void *)android_media_MtpClient_delete_object},
{"native_get_parent", "(II)I", (void *)android_media_MtpClient_get_parent},
{"native_get_storage_id", "(II)I", (void *)android_media_MtpClient_get_storage_id},