better calling of the JAVA (step 2)

This commit is contained in:
Edouard Dupin 2012-04-19 18:11:19 +02:00
parent cda5d8cd40
commit 751a0712d8
3 changed files with 219 additions and 68 deletions

View File

@ -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();
}
}

View File

@ -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 )

View File

@ -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)