浏览代码

Add support for clipboard on Android.

Joachim Meyer 9 年之前
父节点
当前提交
c1eea810e3
共有 1 个文件被更改,包括 117 次插入1 次删除
  1. 117 1
      src/core/PolyAndroidCore.cpp

+ 117 - 1
src/core/PolyAndroidCore.cpp

@@ -282,11 +282,127 @@ CoreMutex *AndroidCore::createMutex() {
 }
 
 void AndroidCore::copyStringToClipboard(const String& str) {
+	// Attaches the current thread to the JVM. 
+	JavaVM* javaVM = view->native_activity->vm;
+	JNIEnv* jniEnv;
+	bool attached = false;
+
+	if(javaVM->GetEnv((void**)&jniEnv, JNI_VERSION_1_6) ==JNI_EDETACHED){
+		JavaVMAttachArgs attachArgs;
+		attachArgs.version = JNI_VERSION_1_6;
+		attachArgs.name = "NativeThread";
+		attachArgs.group = NULL;
+		
+		jint result = javaVM->AttachCurrentThread(&jniEnv, &attachArgs);
+		if(result == JNI_ERR){
+			return;
+		}
+		attached = true;
+	} 
 
+	
+	jclass looperClass = jniEnv->FindClass("android/os/Looper");
+	jmethodID prepareMethodID = jniEnv->GetStaticMethodID(looperClass, "prepare", "()V");
+	jniEnv->CallStaticVoidMethod(looperClass, prepareMethodID);
+	
+	// Retrieves Context.CLIPBOARD_SERVICE. 
+	jclass ClassContext = jniEnv->FindClass("android/content/Context");
+	jfieldID FieldCLIPBOARD_SERVICE = jniEnv->GetStaticFieldID(ClassContext, "CLIPBOARD_SERVICE", "Ljava/lang/String;");
+	jobject CLIPBOARD_SERVICE = jniEnv->GetStaticObjectField(ClassContext, FieldCLIPBOARD_SERVICE);
+// 	jstring CLIPBOARD_SERVICE = jniEnv->NewStringUTF("clipboard");
+
+	jclass ClassNativeActivity = jniEnv->FindClass("android/app/NativeActivity");
+	jobject lNativeActivity = view->native_activity->clazz;
+	
+	// Runs getSystemService(Context.CLIPBOARD_SERVICE).
+	jclass ClassClipboardManager = jniEnv->FindClass("android/content/ClipboardManager");
+	jmethodID MethodGetSystemService = jniEnv->GetMethodID(ClassNativeActivity, "getSystemService", "(Ljava/lang/String;)Ljava/lang/Object;");
+	jobject lCliboardManager = jniEnv->CallObjectMethod(lNativeActivity, MethodGetSystemService, CLIPBOARD_SERVICE);
+	
+	// Runs clipData.newPlainText()
+	jclass ClassClipData = jniEnv->FindClass("android/content/ClipData");
+	jmethodID MethodnewPlainText = jniEnv->GetStaticMethodID(ClassClipData, "newPlainText", "(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)Landroid/content/ClipData;");
+	jstring text = jniEnv->NewStringUTF(str.c_str());
+	jstring lbl = jniEnv->NewStringUTF("PolycodeText");
+	jobject lClipData = jniEnv->CallStaticObjectMethod(ClassClipData, MethodnewPlainText, lbl, text);
+	
+	jmethodID MethodSetPrimaryClip = jniEnv->GetMethodID(ClassClipboardManager, "setPrimaryClip", "(Landroid/content/ClipData;)V");
+	jniEnv->CallVoidMethod(lCliboardManager, MethodSetPrimaryClip, lClipData);
+	
+	// Finished with the JVM.
+	if (attached)
+		javaVM->DetachCurrentThread();
 }
 
 String AndroidCore::getClipboardString() {
-	return "";
+	// Attaches the current thread to the JVM. 
+	JavaVM* javaVM = view->native_activity->vm;
+	JNIEnv* jniEnv;
+	bool attached = false;
+
+	if(javaVM->GetEnv((void**)&jniEnv, JNI_VERSION_1_6) ==JNI_EDETACHED){
+		JavaVMAttachArgs attachArgs;
+		attachArgs.version = JNI_VERSION_1_6;
+		attachArgs.name = "NativeThread";
+		attachArgs.group = NULL;
+		
+		jint result = javaVM->AttachCurrentThread(&jniEnv, &attachArgs);
+		if(result == JNI_ERR){
+			return "";
+		}
+		attached = true;
+	} 
+	
+	jclass looperClass = jniEnv->FindClass("android/os/Looper");
+	jmethodID prepareMethodID = jniEnv->GetStaticMethodID(looperClass, "prepare", "()V");
+	jniEnv->CallStaticVoidMethod(looperClass, prepareMethodID);
+
+	// Retrieves Context.CLIPBOARD_SERVICE. 
+	jclass ClassContext = jniEnv->FindClass("android/content/Context");
+	jfieldID FieldCLIPBOARD_SERVICE = jniEnv->GetStaticFieldID(ClassContext, "CLIPBOARD_SERVICE", "Ljava/lang/String;");
+	jobject CLIPBOARD_SERVICE = jniEnv->GetStaticObjectField(ClassContext, FieldCLIPBOARD_SERVICE);
+
+	jclass ClassNativeActivity = jniEnv->FindClass("android/app/NativeActivity");
+	jobject lNativeActivity = view->native_activity->clazz;
+	
+	// Runs getSystemService(Context.CLIPBOARD_SERVICE).
+	jclass ClassClipboardManager = jniEnv->FindClass("android/content/ClipboardManager");
+	jmethodID MethodGetSystemService = jniEnv->GetMethodID(ClassNativeActivity, "getSystemService", "(Ljava/lang/String;)Ljava/lang/Object;");
+	jobject lCliboardManager = jniEnv->CallObjectMethod(lNativeActivity, MethodGetSystemService, CLIPBOARD_SERVICE);
+
+	// Runs clipboard.getPrimaryClip()
+	jmethodID MethodGetPrimaryClip = jniEnv->GetMethodID(ClassClipboardManager, "getPrimaryClip", "()Landroid/content/ClipData;");
+	jniEnv->ExceptionDescribe();
+	jobject lClipData = jniEnv->CallObjectMethod(lCliboardManager, MethodGetPrimaryClip);
+	jniEnv->ExceptionDescribe();
+	//Runs clipdata.getItemAt(0)
+	jclass ClassClipDataItem = jniEnv->FindClass("android/content/ClipData$Item");
+	jniEnv->ExceptionDescribe();
+	jclass ClassClipData = jniEnv->FindClass("android/content/ClipData");
+	jniEnv->ExceptionDescribe();
+	jmethodID MethodGetItemAt = jniEnv->GetMethodID(ClassClipData, "getItemAt", "(I)Landroid/content/ClipData$Item;");
+	jniEnv->ExceptionDescribe();
+	jobject lClipDataItem = jniEnv->CallObjectMethod(lClipData, MethodGetItemAt, 0);
+	jniEnv->ExceptionDescribe();
+	//Runs clipdescription.getText()
+	
+	jmethodID MethodGetText = jniEnv->GetMethodID(ClassClipDataItem, "getText", "()Ljava/lang/CharSequence;");
+	jniEnv->ExceptionDescribe();
+	jobject lCharSequence = jniEnv->CallObjectMethod(lClipDataItem, MethodGetText);
+	jniEnv->ExceptionDescribe();
+	//Runs charseuquence.toString()
+	jclass ClassCharSequence = jniEnv->FindClass("java/lang/CharSequence");
+	jmethodID MethodtoString = jniEnv->GetMethodID(ClassCharSequence, "toString", "()Ljava/lang/String;");
+	jobject lText = jniEnv->CallObjectMethod(lCharSequence, MethodtoString);
+	
+	const char *nativeString = jniEnv->GetStringUTFChars((jstring)lText, (jboolean*)0);
+	String returnStr = String(nativeString);
+	jniEnv->ReleaseStringUTFChars((jstring)lText, nativeString);
+	
+	// Finished with the JVM.
+	if (attached)
+		javaVM->DetachCurrentThread();
+	return returnStr;
 }
 
 void AndroidCore::extractResources(){