From d3c899e3765fc832d9e33aab99525dcfbb5436d0 Mon Sep 17 00:00:00 2001 From: perry.werneck@gmail.com Date: Tue, 15 May 2012 19:05:56 +0000 Subject: [PATCH] Testando envio de mensagems jni<->android --- android/jni/main.cpp | 29 ++++++++++++++++++++++++++--- android/res/values/strings.xml | 25 +++++++++++++++++++++++++ android/src/br/com/bb/pw3270/PW3270Activity.java | 25 ++++++++++++++++++------- android/src/br/com/bb/pw3270/lib3270.java | 106 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------------------- 4 files changed, 149 insertions(+), 36 deletions(-) create mode 100644 android/res/values/strings.xml diff --git a/android/jni/main.cpp b/android/jni/main.cpp index 1ace974..656d7a7 100644 --- a/android/jni/main.cpp +++ b/android/jni/main.cpp @@ -28,6 +28,7 @@ #include "globals.h" #include + #include /*--[ Defines ]--------------------------------------------------------------------------------------*/ @@ -57,25 +58,47 @@ static void post_message(H3270 *session, int msgid, int arg1 = 0, int arg2 = 0) JNIEnv * env = ((INFO *) session->widget)->env; jobject obj = ((INFO *) session->widget)->obj; jclass cls = env->GetObjectClass(obj); - jmethodID mid = env->GetMethodID(cls, "post_message", "(III)V");; + jmethodID mid = env->GetMethodID(cls, "postMessage", "(III)V");; env->CallVoidMethod(obj,mid,(jint) msgid, (jint) arg1, (jint) arg2); } } static void update_status(H3270 *session, LIB3270_MESSAGE id) { - post_message(session,0,id); + post_message(session,1,id); } static void changed(H3270 *session, int offset, int len) { - post_message(session,1,offset,len); + post_message(session,2,offset,len); +} + +static int popuphandler(H3270 *session, void *terminal, LIB3270_NOTIFY type, const char *title, const char *msg, const char *fmt, va_list args) +{ + if(session->widget) + { + JNIEnv * env = ((INFO *) session->widget)->env; + jobject obj = ((INFO *) session->widget)->obj; + jclass cls = env->GetObjectClass(obj); + jmethodID mid = env->GetMethodID(cls, "postPopup", "(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)V"); + char * descr; + + descr = lib3270_vsprintf(fmt, args); + + env->CallVoidMethod(obj,mid, (jint) type, + env->NewStringUTF(title), + env->NewStringUTF(msg), + env->NewStringUTF(descr) ); + lib3270_free(descr); + } } JNIEXPORT jint JNICALL Java_br_com_bb_pw3270_lib3270_init(JNIEnv *env, jclass obj) { H3270 * session = lib3270_session_new(""); + lib3270_set_popup_handler(popuphandler); + session->changed = changed; session->update_status = update_status; diff --git a/android/res/values/strings.xml b/android/res/values/strings.xml new file mode 100644 index 0000000..525841f --- /dev/null +++ b/android/res/values/strings.xml @@ -0,0 +1,25 @@ + + + + Hello World, PW3270Activity! + PW3270 + + LIB3270_MESSAGE_NONE + LIB3270_MESSAGE_SYSWAIT + LIB3270_MESSAGE_TWAIT + LIB3270_MESSAGE_CONNECTED + LIB3270_MESSAGE_DISCONNECTED + LIB3270_MESSAGE_AWAITING_FIRST + LIB3270_MESSAGE_MINUS + LIB3270_MESSAGE_PROTECTED + LIB3270_MESSAGE_NUMERIC + LIB3270_MESSAGE_OVERFLOW + LIB3270_MESSAGE_INHIBIT + LIB3270_MESSAGE_KYBDLOCK + LIB3270_MESSAGE_X + LIB3270_MESSAGE_RESOLVING + LIB3270_MESSAGE_CONNECTING + + + + \ No newline at end of file diff --git a/android/src/br/com/bb/pw3270/PW3270Activity.java b/android/src/br/com/bb/pw3270/PW3270Activity.java index 15c6551..8adb18a 100644 --- a/android/src/br/com/bb/pw3270/PW3270Activity.java +++ b/android/src/br/com/bb/pw3270/PW3270Activity.java @@ -6,6 +6,7 @@ import android.widget.TextView; import android.widget.Button; import android.widget.EditText; import android.view.View; +import android.content.res.*; public class PW3270Activity extends Activity implements View.OnClickListener { @@ -20,24 +21,34 @@ public class PW3270Activity extends Activity implements View.OnClickListener } - protected void update_message(int id) + protected void updateProgramMessage(int id) { - this.view.setText("ID=" + id); + this.view.setText(message[id]); + } + + public void popupMessage(int type, String title, String text, String info) + { + this.view.setText(title + "\n" + text + "\n" + info); } }; - terminal host; - EditText uri; + private terminal host; + private EditText uri; + private Resources res; + private String[] message; /** Called when the activity is first created. */ @Override - public void onCreate(Bundle savedInstanceState) { + public void onCreate(Bundle savedInstanceState) + { super.onCreate(savedInstanceState); setContentView(R.layout.main); - uri = (EditText) findViewById(R.id.hostname); + res = getResources(); + message = res.getStringArray(R.array.program_msg); + uri = (EditText) findViewById(R.id.hostname); // Set button Button btn = (Button) findViewById(R.id.connect); @@ -50,7 +61,7 @@ public class PW3270Activity extends Activity implements View.OnClickListener public void onClick(View v) { // Perform action on click - host.setHost(uri.getText().toString()); + // host.setHost(uri.getText().toString()); host.connect(); } diff --git a/android/src/br/com/bb/pw3270/lib3270.java b/android/src/br/com/bb/pw3270/lib3270.java index 472d526..1053a14 100644 --- a/android/src/br/com/bb/pw3270/lib3270.java +++ b/android/src/br/com/bb/pw3270/lib3270.java @@ -8,8 +8,8 @@ import android.os.Message; public class lib3270 { - NetworkThread terminal; - + private NetworkThread mainloop; + static { System.loadLibrary("3270"); @@ -18,29 +18,46 @@ public class lib3270 lib3270() { - terminal = new NetworkThread(handler); + mainloop = null; + } + + private class popupMessageInfo + { + public String title; + public String text; + public String info; + + popupMessageInfo(String title, String text, String info) + { + this.title = title; + this.text = text; + this.info = info; + } } // Main Thread - private class NetworkThread extends Thread + private class NetworkThread extends Thread { Handler mHandler; - - NetworkThread(Handler h) + + NetworkThread(Handler h) { mHandler = h; } - + public void run() { - postMessage(0,99,0); -/* + postMessage(0,1,0); + postPopup(0,"titulo","texto","info"); + + /* do_connect(); while(isConnected()) processEvents(); -*/ + */ + postMessage(0,0,0); } - + public void postMessage(int what, int arg1, int arg2) { Message msg = mHandler.obtainMessage(); @@ -49,39 +66,77 @@ public class lib3270 msg.arg2 = arg2; mHandler.sendMessage(msg); } - + + public void postPopup(int type, String title, String text, String info) + { + Message msg = mHandler.obtainMessage(); + + msg.what = 3; + msg.arg1 = type; + msg.obj = new popupMessageInfo(title,text,info); + mHandler.sendMessage(msg); + } + } - + + public void postMessage(int what, int arg1, int arg2) + { + mainloop.postMessage(what, arg1, arg2); + } + // Define the Handler that receives messages from the thread and update the progress - final Handler handler = new Handler() + final Handler handler = new Handler() { public void handleMessage(Message msg) { switch(msg.what) { - case 0: - update_message(msg.arg1); + case 0: // Start/Stop service thread + if(msg.arg1 == 0) + { + mainloop = null; + } + break; + + case 1: // OIA message has changed + updateProgramMessage(msg.arg1); + break; + + case 2: // Screen changed + break; + + case 3: // Popup + popupMessageInfo popup = (popupMessageInfo) msg.obj; + popupMessage(msg.arg1, popup.title, popup.text, popup.info); + break; - } } }; - + /*---[ Signal methods ]--------------------------------------------------*/ - - protected void update_message(int id) + + protected void updateProgramMessage(int id) + { + } + + public void popupMessage(int type, String title, String text, String info) { } - /*---[ External methods ]------------------------------------------------*/ public int connect() { - terminal.start(); - return 0; + if(mainloop == null) + { + mainloop = new NetworkThread(handler); + mainloop.start(); + return 0; + } + return -1; } - + /*---[ Native calls ]----------------------------------------------------*/ static private native int init(); @@ -90,7 +145,6 @@ public class lib3270 // Misc calls public native String getEncoding(); - public native String getVersion(); public native String getRevision(); @@ -100,5 +154,5 @@ public class lib3270 public native boolean isConnected(); public native boolean isTerminalReady(); - + } -- libgit2 0.21.2