From 751a0712d8203e73e0ce862e168f38a3373e6d13 Mon Sep 17 00:00:00 2001 From: Edouard Dupin Date: Thu, 19 Apr 2012 18:11:19 +0200 Subject: [PATCH] better calling of the JAVA (step 2) --- Java/PROJECT_NAME.java | 44 +++-- Java/ewolAndroidAbstraction.cpp | 239 +++++++++++++++++------ Sources/libewol/ewol/base/guiAndroid.cpp | 4 +- 3 files changed, 219 insertions(+), 68 deletions(-) diff --git a/Java/PROJECT_NAME.java b/Java/PROJECT_NAME.java index cabae81f..d6a35874 100644 --- a/Java/PROJECT_NAME.java +++ b/Java/PROJECT_NAME.java @@ -17,6 +17,8 @@ import android.view.Window; // For the full screen : import android.view.WindowManager; +// for the keyboard event : +import android.view.inputmethod.InputMethodManager; import java.io.File; import android.content.Context; @@ -36,7 +38,8 @@ import android.content.res.AssetManager; */ public class __PROJECT_NAME__ extends Activity { private static native void TouchEvent(); - private static native void ActivitySetJavaVortualMachineStart(); + private static native void ActivitySetJavaVortualMachineStart(__PROJECT_NAME__ ActivityInstance); + //private static native void ActivitySetJavaVortualMachineStart(); private static native void ActivitySetJavaVortualMachineStop(); private static native void ActivityOnCreate(); private static native void ActivityOnStart(); @@ -51,14 +54,17 @@ public class __PROJECT_NAME__ extends Activity { static { System.loadLibrary("__PROJECT_PACKAGE__"); + //ActivitySetInstance(this); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + // set the java evironement in the C sources : - ActivitySetJavaVortualMachineStart(); + ActivitySetJavaVortualMachineStart(this); + //ActivitySetJavaVortualMachineStart(); // Load the application directory ActivityParamSetArchiveDir(1, getFilesDir().toString()); @@ -87,6 +93,10 @@ public class __PROJECT_NAME__ extends Activity { requestWindowFeature(Window.FEATURE_NO_TITLE); // set full screen Mode : getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); + // display keyboard: + //getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); + // hide keyboard : + getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN); //Force landscape //setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); // create bsurface system @@ -138,23 +148,33 @@ public class __PROJECT_NAME__ extends Activity { // Remove the java Virtual machine pointer form the C code ActivitySetJavaVortualMachineStop(); } + + @Override protected void finalize() throws Throwable + { + super.finalize(); + // cleanup your object here + } + public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); } + public void CPP_keyboardShow() + { + TouchEvent(); + try{ + getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE); + } catch (Exception e) { + + } + TouchEvent(); + } + public static void eventFromCPP(String[] args) { - if (args[0] == "Keyboard_Show") { - TouchEvent(); - TouchEvent(); - TouchEvent(); - } else if (args[0] == "Keyboard_Hide") { - TouchEvent(); - TouchEvent(); - } else { - TouchEvent(); - } + // just for the test ... + TouchEvent(); } } diff --git a/Java/ewolAndroidAbstraction.cpp b/Java/ewolAndroidAbstraction.cpp index d9e85a99..fb7d3aa9 100644 --- a/Java/ewolAndroidAbstraction.cpp +++ b/Java/ewolAndroidAbstraction.cpp @@ -45,13 +45,150 @@ void EWOL_NativeGLDestroy(void); // get a resources from the java environement : static JNIEnv* JavaVirtualMachinePointer = NULL; // the JVM static jclass javaClassActivity = 0; // main activity class (android ...) +static jobject javaObjectActivity = 0; static jmethodID javaClassActivityEntryPoint = 0; // basic methode to call ... +static jmethodID javaClassActivityEntryPoint__CPP_keyboardShow = 0; // basic methode to call ... // generic classes static jclass javaDefaultClassString = 0; // default string class static JavaVM* g_JavaVM = NULL; +// jni doc : /usr/lib/jvm/java-1.6.0-openjdk/include + + +// for exemple test : +void displayKeyboard(bool pShow) { + // Attaches the current thread to the JVM. + jint lResult; + jint lFlags = 0; + + JavaVM* lJavaVM = g_JavaVM; + JNIEnv* lJNIEnv = NULL; + + int status = g_JavaVM->GetEnv((void **) &lJNIEnv, JNI_VERSION_1_6); + if (status == JNI_EDETACHED) { + JavaVMAttachArgs lJavaVMAttachArgs; + lJavaVMAttachArgs.version = JNI_VERSION_1_6; + lJavaVMAttachArgs.name = "EwolNativeThread"; + lJavaVMAttachArgs.group = NULL; + status = g_JavaVM->AttachCurrentThread(&lJNIEnv, &lJavaVMAttachArgs); + if (status != JNI_OK) { + APPL_DEBUG("C->java : AttachCurrentThread failed : " << status); + return; + } + if (JavaVirtualMachinePointer->ExceptionOccurred()) { + JavaVirtualMachinePointer->ExceptionDescribe(); + JavaVirtualMachinePointer->ExceptionClear(); + } + } + /* + if (lResult == JNI_ERR) { + return; + } + */ + if (JavaVirtualMachinePointer->ExceptionOccurred()) { + JavaVirtualMachinePointer->ExceptionDescribe(); + JavaVirtualMachinePointer->ExceptionClear(); + } + + // Retrieves NativeActivity. + jobject lNativeActivity = javaClassActivity; + jclass ClassNativeActivity = lJNIEnv->GetObjectClass(lNativeActivity); + + // Retrieves Context.INPUT_METHOD_SERVICE. + jclass ClassContext = lJNIEnv->FindClass("android/content/Context"); + jfieldID FieldINPUT_METHOD_SERVICE = lJNIEnv->GetStaticFieldID(ClassContext, "INPUT_METHOD_SERVICE", "Ljava/lang/String;"); + jobject INPUT_METHOD_SERVICE = lJNIEnv->GetStaticObjectField(ClassContext, FieldINPUT_METHOD_SERVICE); + // TODO : jniCheck(INPUT_METHOD_SERVICE); + + // Runs getSystemService(Context.INPUT_METHOD_SERVICE). + jclass ClassInputMethodManager = lJNIEnv->FindClass("android/view/inputmethod/InputMethodManager"); + jmethodID MethodGetSystemService = lJNIEnv->GetMethodID(ClassNativeActivity, "getSystemService", "(Ljava/lang/String;)Ljava/lang/Object;"); + jobject lInputMethodManager = lJNIEnv->CallObjectMethod(lNativeActivity, MethodGetSystemService, INPUT_METHOD_SERVICE); + + // Runs getWindow().getDecorView(). + jmethodID MethodGetWindow = lJNIEnv->GetMethodID(ClassNativeActivity, "getWindow", "()Landroid/view/Window;"); + jobject lWindow = lJNIEnv->CallObjectMethod(lNativeActivity, MethodGetWindow); + jclass ClassWindow = lJNIEnv->FindClass("android/view/Window"); + jmethodID MethodGetDecorView = lJNIEnv->GetMethodID(ClassWindow, "getDecorView", "()Landroid/view/View;"); + jobject lDecorView = lJNIEnv->CallObjectMethod(lWindow, MethodGetDecorView); + + if (pShow) { + // Runs lInputMethodManager.showSoftInput(...). + jmethodID MethodShowSoftInput = lJNIEnv->GetMethodID( ClassInputMethodManager, "showSoftInput", "(Landroid/view/View;I)Z"); + jboolean lResult = lJNIEnv->CallBooleanMethod(lInputMethodManager, MethodShowSoftInput, lDecorView, lFlags); + } else { + // Runs lWindow.getViewToken() + jclass ClassView = lJNIEnv->FindClass("android/view/View"); + jmethodID MethodGetWindowToken = lJNIEnv->GetMethodID(ClassView, "getWindowToken", "()Landroid/os/IBinder;"); + jobject lBinder = lJNIEnv->CallObjectMethod(lDecorView, MethodGetWindowToken); + // lInputMethodManager.hideSoftInput(...). + jmethodID MethodHideSoftInput = lJNIEnv->GetMethodID( ClassInputMethodManager, "hideSoftInputFromWindow", "(Landroid/os/IBinder;I)Z"); + jboolean lRes = lJNIEnv->CallBooleanMethod( lInputMethodManager, MethodHideSoftInput, lBinder, lFlags); + } + + // Finished with the JVM. + lJavaVM->DetachCurrentThread(); + +} + + +void SendJava_KeyboardShow(void) +{ + APPL_DEBUG("C->java : call java"); + if (NULL == g_JavaVM) { + APPL_DEBUG("C->java : JVM not initialised"); + return; + } + JNIEnv *JavaVirtualMachinePointer_tmp; + int status = g_JavaVM->GetEnv((void **) &JavaVirtualMachinePointer_tmp, JNI_VERSION_1_6); + if (status == JNI_EDETACHED) { + JavaVMAttachArgs lJavaVMAttachArgs; + lJavaVMAttachArgs.version = JNI_VERSION_1_6; + lJavaVMAttachArgs.name = "EwolNativeThread"; + lJavaVMAttachArgs.group = NULL; + status = g_JavaVM->AttachCurrentThread(&JavaVirtualMachinePointer_tmp, &lJavaVMAttachArgs); + if (status != JNI_OK) { + APPL_DEBUG("C->java : AttachCurrentThread failed : " << status); + return; + } + if (JavaVirtualMachinePointer->ExceptionOccurred()) { + APPL_DEBUG("C->java : EXEPTION ..."); + JavaVirtualMachinePointer->ExceptionDescribe(); + JavaVirtualMachinePointer->ExceptionClear(); + } + } + if (JavaVirtualMachinePointer->ExceptionOccurred()) { + APPL_DEBUG("C->java : EXEPTION ..."); + JavaVirtualMachinePointer->ExceptionDescribe(); + JavaVirtualMachinePointer->ExceptionClear(); + } + + APPL_DEBUG("C->java : 111"); + if (NULL == JavaVirtualMachinePointer) { + APPL_DEBUG("C->java : JVM not initialised"); + return; + } + + APPL_DEBUG("C->java : 333"); + //Call java ... + //JavaVirtualMachinePointer->CallVoidMethod(javaClassActivity, javaClassActivityEntryPoint__CPP_keyboardShow); + //JavaVirtualMachinePointer->CallStaticVoidMethod(javaClassActivity, javaClassActivityEntryPoint__CPP_keyboardShow); + JavaVirtualMachinePointer->CallVoidMethod(javaObjectActivity, javaClassActivityEntryPoint__CPP_keyboardShow); + + + APPL_DEBUG("C->java : 444"); + // manage execption : + if (JavaVirtualMachinePointer->ExceptionOccurred()) { + APPL_DEBUG("C->java : EXEPTION ..."); + JavaVirtualMachinePointer->ExceptionDescribe(); + JavaVirtualMachinePointer->ExceptionClear(); + } + + // Finished with the JVM. + g_JavaVM->DetachCurrentThread(); +} void SendSystemMessage(const char * dataString) { @@ -60,84 +197,56 @@ void SendSystemMessage(const char * dataString) APPL_DEBUG("C->java : JVM not initialised"); return; } - JNIEnv *JavaVirtualMachinePointer; - int status = g_JavaVM->GetEnv((void **) &JavaVirtualMachinePointer, JNI_VERSION_1_6); + JNIEnv *JavaVirtualMachinePointer_tmp; + int status = g_JavaVM->GetEnv((void **) &JavaVirtualMachinePointer_tmp, JNI_VERSION_1_6); if (status == JNI_EDETACHED) { - status = g_JavaVM->AttachCurrentThread(&JavaVirtualMachinePointer, NULL); + JavaVMAttachArgs lJavaVMAttachArgs; + lJavaVMAttachArgs.version = JNI_VERSION_1_6; + lJavaVMAttachArgs.name = "EwolNativeThread"; + lJavaVMAttachArgs.group = NULL; + status = g_JavaVM->AttachCurrentThread(&JavaVirtualMachinePointer_tmp, &lJavaVMAttachArgs); if (status != JNI_OK) { APPL_DEBUG("C->java : AttachCurrentThread failed : " << status); return; } - jclass javaClassActivity = JavaVirtualMachinePointer->FindClass("com.__PROJECT_VENDOR__.__PROJECT_PACKAGE__.__PROJECT_NAME__" ); - if (javaClassActivity == 0) { - APPL_DEBUG("C->java : Can't find com.__PROJECT_VENDOR__.__PROJECT_PACKAGE__.__PROJECT_NAME__ class"); - // remove access on the virtual machine : - JavaVirtualMachinePointer = NULL; - return; - } - jmethodID javaClassActivityEntryPoint = JavaVirtualMachinePointer->GetStaticMethodID(javaClassActivity, "eventFromCPP", "([Ljava/lang/String;)V" ); - if (javaClassActivityEntryPoint == 0) { - APPL_DEBUG("C->java : Can't find com.__PROJECT_VENDOR__.__PROJECT_PACKAGE__.__PROJECT_NAME__.eventFromCPP" ); - // remove access on the virtual machine : - JavaVirtualMachinePointer = NULL; - return; - } - jclass javaDefaultClassString = JavaVirtualMachinePointer->FindClass("java/lang/String" ); - if (javaDefaultClassString == 0) { - APPL_DEBUG("C->java : Can't find java/lang/String" ); - // remove access on the virtual machine : - JavaVirtualMachinePointer = NULL; - return; - } - // create the string to the java - jstring jstr = JavaVirtualMachinePointer->NewStringUTF(dataString); - if (jstr == 0) { - APPL_DEBUG("C->java : Out of memory" ); - return; - } - // create argument list - jobjectArray args = JavaVirtualMachinePointer->NewObjectArray(1, javaDefaultClassString, jstr); - if (args == 0) { - APPL_DEBUG("C->java : Out of memory" ); - return; - } - //Call java ... - JavaVirtualMachinePointer->CallStaticVoidMethod(javaClassActivity, javaClassActivityEntryPoint, args); - - // manage execption : - if (JavaVirtualMachinePointer->ExceptionOccurred()) { - JavaVirtualMachinePointer->ExceptionDescribe(); - } - } else { - APPL_DEBUG("C->java : do nothing ... "); } - - -/* + APPL_DEBUG("C->java : 111"); if (NULL == JavaVirtualMachinePointer) { APPL_DEBUG("C->java : JVM not initialised"); return; } + APPL_DEBUG("C->java : 222"); + if (NULL == dataString) { + APPL_DEBUG("C->java : No data to send ..."); + return; + } + APPL_DEBUG("C->java : 333"); // create the string to the java jstring jstr = JavaVirtualMachinePointer->NewStringUTF(dataString); if (jstr == 0) { APPL_DEBUG("C->java : Out of memory" ); return; } + APPL_DEBUG("C->java : 444"); // create argument list jobjectArray args = JavaVirtualMachinePointer->NewObjectArray(1, javaDefaultClassString, jstr); if (args == 0) { APPL_DEBUG("C->java : Out of memory" ); return; } + APPL_DEBUG("C->java : 555"); //Call java ... JavaVirtualMachinePointer->CallStaticVoidMethod(javaClassActivity, javaClassActivityEntryPoint, args); + APPL_DEBUG("C->java : 666"); // manage execption : if (JavaVirtualMachinePointer->ExceptionOccurred()) { JavaVirtualMachinePointer->ExceptionDescribe(); + JavaVirtualMachinePointer->ExceptionClear(); } -*/ + + // Finished with the JVM. + g_JavaVM->DetachCurrentThread(); } @@ -164,12 +273,18 @@ extern "C" void Java_com___PROJECT_VENDOR_____PROJECT_PACKAGE_____PROJECT_NAME___ActivityParamSetArchiveDir( JNIEnv* env, jobject thiz, jint mode, jstring myString) { // direct setting of the date in the string system ... - const char* str = env->GetStringUTFChars(myString,0); + jboolean isCopy; + const char* str = env->GetStringUTFChars(myString, &isCopy); EWOL_ThreadSetArchiveDir(mode, str); - //env->ReleaseStringUTFChars(str,myString,0); + if (isCopy == JNI_TRUE) { + // from here str is reset ... + env->ReleaseStringUTFChars(myString, str); + str = NULL; + } } - void Java_com___PROJECT_VENDOR_____PROJECT_PACKAGE_____PROJECT_NAME___ActivitySetJavaVortualMachineStart( JNIEnv* env ) + void Java_com___PROJECT_VENDOR_____PROJECT_PACKAGE_____PROJECT_NAME___ActivitySetJavaVortualMachineStart( JNIEnv* env, jclass classBase, jobject obj) + //void Java_com___PROJECT_VENDOR_____PROJECT_PACKAGE_____PROJECT_NAME___ActivitySetJavaVortualMachineStart( JNIEnv* env) { APPL_DEBUG("*******************************************"); APPL_DEBUG("** Set JVM Pointer **"); @@ -177,20 +292,30 @@ extern "C" JavaVirtualMachinePointer = env; // get default needed all time elements : if (NULL != JavaVirtualMachinePointer) { - javaClassActivity = JavaVirtualMachinePointer->FindClass("com.__PROJECT_VENDOR__.__PROJECT_PACKAGE__.__PROJECT_NAME__" ); + javaClassActivity = JavaVirtualMachinePointer->FindClass("com/__PROJECT_VENDOR__/__PROJECT_PACKAGE__/__PROJECT_NAME__" ); if (javaClassActivity == 0) { - APPL_DEBUG("C->java : Can't find com.__PROJECT_VENDOR__.__PROJECT_PACKAGE__.__PROJECT_NAME__ class"); + APPL_DEBUG("C->java : Can't find com/__PROJECT_VENDOR__/__PROJECT_PACKAGE__/__PROJECT_NAME__ class"); // remove access on the virtual machine : JavaVirtualMachinePointer = NULL; return; } + // get the activity object : javaClassActivityEntryPoint = JavaVirtualMachinePointer->GetStaticMethodID(javaClassActivity, "eventFromCPP", "([Ljava/lang/String;)V" ); if (javaClassActivityEntryPoint == 0) { - APPL_DEBUG("C->java : Can't find com.__PROJECT_VENDOR__.__PROJECT_PACKAGE__.__PROJECT_NAME__.eventFromCPP" ); + APPL_DEBUG("C->java : Can't find com/__PROJECT_VENDOR__/__PROJECT_PACKAGE__/__PROJECT_NAME__.eventFromCPP" ); // remove access on the virtual machine : JavaVirtualMachinePointer = NULL; return; } + javaClassActivityEntryPoint__CPP_keyboardShow = JavaVirtualMachinePointer->GetMethodID(javaClassActivity, "CPP_keyboardShow", "()V" ); + if (javaClassActivityEntryPoint == 0) { + APPL_DEBUG("C->java : Can't find com/__PROJECT_VENDOR__/__PROJECT_PACKAGE__/__PROJECT_NAME__.CPP_keyboardShow" ); + // remove access on the virtual machine : + JavaVirtualMachinePointer = NULL; + return; + } + javaObjectActivity = JavaVirtualMachinePointer->NewGlobalRef(obj); + javaDefaultClassString = JavaVirtualMachinePointer->FindClass("java/lang/String" ); if (javaDefaultClassString == 0) { APPL_DEBUG("C->java : Can't find java/lang/String" ); @@ -210,6 +335,10 @@ extern "C" void Java_com___PROJECT_VENDOR_____PROJECT_PACKAGE_____PROJECT_NAME___TouchEvent( JNIEnv* env ) { APPL_DEBUG(" ==> Touch Event"); + if (env->ExceptionOccurred()) { + env->ExceptionDescribe(); + env->ExceptionClear(); + } } void Java_com___PROJECT_VENDOR_____PROJECT_PACKAGE_____PROJECT_NAME___ActivityOnCreate( JNIEnv* env ) diff --git a/Sources/libewol/ewol/base/guiAndroid.cpp b/Sources/libewol/ewol/base/guiAndroid.cpp index a5741a28..ddcf519d 100644 --- a/Sources/libewol/ewol/base/guiAndroid.cpp +++ b/Sources/libewol/ewol/base/guiAndroid.cpp @@ -247,13 +247,15 @@ void guiAbstraction::Stop(void) { // TODo : send a message to the android system to stop ... } + // java system to send message : void SendSystemMessage(const char * dataString); +void SendJava_KeyboardShow(void); void guiAbstraction::KeyboardShow(ewol::keyboardMode_te mode) { // send a message at the java : - SendSystemMessage("Keyboard_Show"); + SendJava_KeyboardShow(); } void guiAbstraction::KeyboardHide(void)