Index: /pjproject/trunk/pjmedia/src/pjmedia-videodev/android_opengl.c
===================================================================
--- /pjproject/trunk/pjmedia/src/pjmedia-videodev/android_opengl.c	(revision 5013)
+++ /pjproject/trunk/pjmedia/src/pjmedia-videodev/android_opengl.c	(revision 5014)
@@ -137,16 +137,4 @@
 };
 
-static void get_jvm(JNIEnv **jni_env)
-{
-    (*pj_jni_jvm)->GetEnv(pj_jni_jvm, (void **)jni_env, JNI_VERSION_1_4);
-}
-
-void* android_opengl_get_surface(jobject surface)
-{
-    JNIEnv *env = 0;
-    get_jvm(&env);
-    return ((env && surface)? ANativeWindow_fromSurface(env, surface): NULL);
-}
-
 int pjmedia_vid_dev_opengl_imp_get_cap(void)
 {
Index: /pjproject/trunk/pjsip-apps/src/pjsua/android/jni/pjsua.i
===================================================================
--- /pjproject/trunk/pjsip-apps/src/pjsua/android/jni/pjsua.i	(revision 5013)
+++ /pjproject/trunk/pjsip-apps/src/pjsua/android/jni/pjsua.i	(revision 5014)
@@ -4,4 +4,5 @@
 #include "pjsua_app_callback.h"
 #include "../../pjsua_app.h"
+#include <android/native_window_jni.h>
 
 #ifdef __cplusplus
@@ -17,13 +18,11 @@
 %}
 
-int pjsuaStart();
-void pjsuaDestroy();
-int pjsuaRestart();
-
-/* turn on director wrapping PjsuaAppCallback */
+/* Turn on director wrapping PjsuaAppCallback */
 %feature("director") PjsuaAppCallback;
 
+/* Convert Surface object to ANativeWindow for setIncomingVideoRenderer() */
+%typemap(in) jobject surface {
+    $1 = (jobject)ANativeWindow_fromSurface(jenv, $input);
+}
+
 %include "pjsua_app_callback.h"
-
-void setCallbackObject(PjsuaAppCallback* callback);
-
Index: /pjproject/trunk/pjsip-apps/src/pjsua/android/jni/pjsua_app_callback.cpp
===================================================================
--- /pjproject/trunk/pjsip-apps/src/pjsua/android/jni/pjsua_app_callback.cpp	(revision 5013)
+++ /pjproject/trunk/pjsip-apps/src/pjsua/android/jni/pjsua_app_callback.cpp	(revision 5014)
@@ -30,4 +30,6 @@
 static int restart_argc;
 static char **restart_argv;
+static pjsua_callback pjsua_cb_orig;
+static jobject callVideoSurface;
 
 extern const char *pjsua_app_def_argv[];
@@ -42,9 +44,42 @@
 }
 
+static void on_call_media_state(pjsua_call_id call_id)
+{
+    pjsua_call_info call_info;
+    unsigned mi;
+    pj_bool_t has_error = PJ_FALSE;
+
+    pjsua_call_get_info(call_id, &call_info);
+
+    for (mi=0; mi<call_info.media_cnt; ++mi) {
+        pjsua_call_media_info *med_info = &call_info.media[mi];
+	if (med_info->type == PJMEDIA_TYPE_VIDEO &&
+	    med_info->status == PJSUA_CALL_MEDIA_ACTIVE &&
+	    med_info->stream.vid.win_in != PJSUA_INVALID_ID)
+	{
+	    pjmedia_vid_dev_hwnd vhwnd;
+
+	    /* Setup renderer surface */
+	    pj_bzero(&vhwnd, sizeof(vhwnd));
+	    vhwnd.type = PJMEDIA_VID_DEV_HWND_TYPE_ANDROID;
+	    vhwnd.info.window = callVideoSurface;
+	    pjsua_vid_win_set_win(med_info->stream.vid.win_in, &vhwnd);
+	    break;
+	}
+    }
+    
+    /* Forward to original callback */
+    if (pjsua_cb_orig.on_call_media_state)
+	(*pjsua_cb_orig.on_call_media_state)(call_id);
+}
 
 /** Callback wrapper **/
 static void on_cli_config(pjsua_app_config *cfg)
 {
+    pjsua_cb_orig = cfg->cfg.cb;
     cfg->log_cfg.cb = &log_writer;
+    
+    /* Override pjsua callback, e.g: to install renderer view */
+    cfg->cfg.cb.on_call_media_state = &on_call_media_state;
 }
 
@@ -127,3 +162,9 @@
 }
 
+
+void setIncomingVideoRenderer(jobject surface)
+{
+    callVideoSurface = surface;
+}
+
 #endif
Index: /pjproject/trunk/pjsip-apps/src/pjsua/android/jni/pjsua_app_callback.h
===================================================================
--- /pjproject/trunk/pjsip-apps/src/pjsua/android/jni/pjsua_app_callback.h	(revision 5013)
+++ /pjproject/trunk/pjsip-apps/src/pjsua/android/jni/pjsua_app_callback.h	(revision 5014)
@@ -20,4 +20,6 @@
 #define __PJSUA_APP_CALLBACK_H__
 
+#include <jni.h>
+
 class PjsuaAppCallback {
 public:
@@ -32,4 +34,5 @@
 int pjsuaRestart();
 void setCallbackObject(PjsuaAppCallback* callback);
+void setIncomingVideoRenderer(jobject surface);
 }
 
Index: /pjproject/trunk/pjsip-apps/src/pjsua/android/res/layout/activity_main.xml
===================================================================
--- /pjproject/trunk/pjsip-apps/src/pjsua/android/res/layout/activity_main.xml	(revision 5013)
+++ /pjproject/trunk/pjsip-apps/src/pjsua/android/res/layout/activity_main.xml	(revision 5014)
@@ -4,4 +4,34 @@
     android:layout_height="fill_parent"
     android:orientation="vertical" >
+
+    <TextView
+        android:id="@+id/textStatus"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_alignParentBottom="true"
+        android:layout_alignParentTop="false"
+        android:layout_centerHorizontal="true"
+        android:textIsSelectable="false" />
+
+    <SurfaceView
+        android:id="@+id/surfaceViewIncomingCall"
+        android:layout_width="wrap_content"
+        android:layout_height="match_parent"
+        android:layout_above="@+id/imageApp"
+        android:layout_alignParentLeft="true"
+        android:layout_alignParentRight="true"
+        android:layout_alignParentTop="true"
+        android:layout_marginBottom="50dp" />
+
+    <TextView
+        android:id="@+id/textApp"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_above="@+id/textStatus"
+        android:layout_centerHorizontal="true"
+        android:layout_marginBottom="126dp"
+        android:text="@string/app_name"
+        android:textSize="40sp"
+        android:typeface="serif" />
 
     <ImageView
@@ -14,21 +44,3 @@
         android:src="@drawable/main_image" />
 
-    <TextView
-        android:id="@+id/textApp"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_centerHorizontal="true"
-        android:layout_centerVertical="true"
-        android:text="@string/app_name"
-        android:textSize="40sp"
-        android:typeface="serif" />
-
-    <TextView
-        android:id="@+id/textStatus"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_alignParentBottom="true"
-        android:layout_centerHorizontal="true" 
-        android:textIsSelectable="false"/>
-
 </RelativeLayout>
Index: /pjproject/trunk/pjsip-apps/src/pjsua/android/src/org/pjsip/pjsua/MainActivity.java
===================================================================
--- /pjproject/trunk/pjsip-apps/src/pjsua/android/src/org/pjsip/pjsua/MainActivity.java	(revision 5013)
+++ /pjproject/trunk/pjsip-apps/src/pjsua/android/src/org/pjsip/pjsua/MainActivity.java	(revision 5014)
@@ -26,4 +26,6 @@
 import android.os.Bundle;
 import android.util.Log;
+import android.view.SurfaceHolder;
+import android.view.SurfaceView;
 import android.os.Handler;
 import android.os.Message;
@@ -31,212 +33,245 @@
 
 class CONST {
-	public static final String LIB_FILENAME = "pjsua";
-	public static final String TAG = "pjsua";
-	public static final Boolean AUTOKILL_ON_FINISH = true;
-	public enum MSG_TYPE {
-		STR_DEBUG,
-		STR_INFO,
-		STR_ERROR,
-		CLI_STOP,
-		CLI_RESTART,
-		QUIT
-	};	
+    public static final String LIB_FILENAME = "pjsua";
+    public static final String TAG = "pjsua";
+    public static final Boolean AUTOKILL_ON_FINISH = true;
+    public enum MSG_TYPE {
+	STR_DEBUG,
+	STR_INFO,
+	STR_ERROR,
+	CLI_STOP,
+	CLI_RESTART,
+	QUIT
+    };
 }
 
 class LOG {
-	public static void DEBUG(Handler h, String str) {
-		Message msg = Message.obtain(h, CONST.MSG_TYPE.STR_DEBUG.ordinal(), 
-									 str);
-		msg.sendToTarget();
-	}	
-	public static void INFO(Handler h, String str) {
-		Message msg = Message.obtain(h, CONST.MSG_TYPE.STR_INFO.ordinal(), 
-									 str);
-		msg.sendToTarget();
-	}
-	public static void ERROR(Handler h, String str) {
-		Message msg = Message.obtain(h, CONST.MSG_TYPE.STR_ERROR.ordinal(), 
-									 str);
-		msg.sendToTarget();
-	}
+    public static void DEBUG(Handler h, String str) {
+	Message msg = Message.obtain(h, CONST.MSG_TYPE.STR_DEBUG.ordinal(), 
+				     str);
+	msg.sendToTarget();
+    }	
+    public static void INFO(Handler h, String str) {
+	Message msg = Message.obtain(h, CONST.MSG_TYPE.STR_INFO.ordinal(), 
+				     str);
+	msg.sendToTarget();
+    }
+    public static void ERROR(Handler h, String str) {
+	Message msg = Message.obtain(h, CONST.MSG_TYPE.STR_ERROR.ordinal(), 
+				     str);
+	msg.sendToTarget();
+    }
 }
 
-public class MainActivity extends Activity {
-	private MyHandler ui_handler = new MyHandler(this);
-	private static MyCallback callback;
-	
-	private static class MyHandler extends Handler {
-		private final WeakReference<MainActivity> mTarget;
-		
-		public MyHandler(MainActivity target) {
-			mTarget = new WeakReference<MainActivity>(target); 
+public class MainActivity extends Activity implements SurfaceHolder.Callback {
+    private MyHandler ui_handler = new MyHandler(this);
+    private static MyCallback callback;
+
+    private static class MyHandler extends Handler {
+	private final WeakReference<MainActivity> mTarget;
+
+	public MyHandler(MainActivity target) {
+	    mTarget = new WeakReference<MainActivity>(target); 
+	}
+
+	@Override
+	public void handleMessage(Message m) {
+	    MainActivity target = mTarget.get();
+	    if (target == null)
+		return;
+
+	    if (m.what == CONST.MSG_TYPE.STR_DEBUG.ordinal()) {
+		Log.d(CONST.TAG, (String)m.obj);	
+	    } else if (m.what == CONST.MSG_TYPE.STR_INFO.ordinal()) {
+		target.updateStatus((String)m.obj);
+		Log.i(CONST.TAG, (String)m.obj);				
+	    } else if (m.what == CONST.MSG_TYPE.STR_ERROR.ordinal()) {
+		target.updateStatus((String)m.obj);
+		Log.e(CONST.TAG, (String)m.obj);
+	    } else if (m.what == CONST.MSG_TYPE.CLI_STOP.ordinal()) {
+		pjsua.pjsuaDestroy();
+		LOG.INFO(this, "Telnet Unavailable");
+	    } else if (m.what == CONST.MSG_TYPE.CLI_RESTART.ordinal()) {
+		int status = pjsua.pjsuaRestart();
+		if (status != 0) {
+		    LOG.INFO(this, "Failed restarting telnet");
 		}
-		
-		@Override
-		public void handleMessage(Message m) {
-			MainActivity target = mTarget.get();
-			if (target == null)
-				return;
-			
-			if (m.what == CONST.MSG_TYPE.STR_DEBUG.ordinal()) {
-				Log.d(CONST.TAG, (String)m.obj);	
-			} else if (m.what == CONST.MSG_TYPE.STR_INFO.ordinal()) {
-				target.updateStatus((String)m.obj);
-				Log.i(CONST.TAG, (String)m.obj);				
-			} else if (m.what == CONST.MSG_TYPE.STR_ERROR.ordinal()) {
-				target.updateStatus((String)m.obj);
-				Log.e(CONST.TAG, (String)m.obj);
-			} else if (m.what == CONST.MSG_TYPE.CLI_STOP.ordinal()) {
-				pjsua.pjsuaDestroy();
-				LOG.INFO(this, "Telnet Unavailable");
-			} else if (m.what == CONST.MSG_TYPE.CLI_RESTART.ordinal()) {
-				int status = pjsua.pjsuaRestart();
-				if (status != 0) {
-					LOG.INFO(this, "Failed restarting telnet");
-				}
-			} else if (m.what == CONST.MSG_TYPE.QUIT.ordinal()) {
-				target.finish();
-				System.gc();
-				android.os.Process.killProcess(android.os.Process.myPid());
-			}
-		}
-    }
-	
-	/** Callback object **/
-	private static class MyCallback extends PjsuaAppCallback {
-		private WeakReference<Handler> ui_handler;
-		
-		public MyCallback(Handler in_ui_handler) {
-			set_ui_handler(in_ui_handler);			
-		}
-		
-		public void set_ui_handler(Handler in_ui_handler) {
-			ui_handler = new WeakReference<Handler>(in_ui_handler);
-		}		
-		
-		@Override
-	    public void onStarted(String msg) {
-			Handler ui = ui_handler.get();
-			LOG.INFO(ui, msg);			
-		}
-		
-		@Override
-	    public void onStopped(int restart) {
-			Handler ui = ui_handler.get();
-			/** Use timer to stopped/restart **/
-			if (restart != 0) {
-				LOG.INFO(ui, "Telnet Restarting");
-				Message msg = Message.obtain(ui, 
-										  CONST.MSG_TYPE.CLI_RESTART.ordinal());
-				ui.sendMessageDelayed(msg, 100);
-			} else {
-				LOG.INFO(ui, "Telnet Stopping");
-				Message msg = Message.obtain(ui, 
-											 CONST.MSG_TYPE.CLI_STOP.ordinal());
-				ui.sendMessageDelayed(msg, 100);
-			}
-		}
-	}
-	
-	private void updateStatus(String output) {
-        TextView tStatus = (TextView) findViewById(R.id.textStatus);
-        tStatus.setText(output);        
-	}
+	    } else if (m.what == CONST.MSG_TYPE.QUIT.ordinal()) {
+		target.finish();
+		System.gc();
+		android.os.Process.killProcess(android.os.Process.myPid());
+	    }
+	}
+    }
+
+    /** Callback object **/
+    private static class MyCallback extends PjsuaAppCallback {
+	private WeakReference<Handler> ui_handler;
+
+	public MyCallback(Handler in_ui_handler) {
+	    set_ui_handler(in_ui_handler);			
+	}
+
+	public void set_ui_handler(Handler in_ui_handler) {
+	    ui_handler = new WeakReference<Handler>(in_ui_handler);
+	}		
+
+	@Override
+	public void onStarted(String msg) {
+	    Handler ui = ui_handler.get();
+	    LOG.INFO(ui, msg);			
+	}
+
+	@Override
+	public void onStopped(int restart) {
+	    Handler ui = ui_handler.get();
+	    /** Use timer to stopped/restart **/
+	    if (restart != 0) {
+		LOG.INFO(ui, "Telnet Restarting");
+		Message msg = Message.obtain(ui, 
+			CONST.MSG_TYPE.CLI_RESTART.ordinal());
+		ui.sendMessageDelayed(msg, 100);
+	    } else {
+		LOG.INFO(ui, "Telnet Stopping");
+		Message msg = Message.obtain(ui, 
+			CONST.MSG_TYPE.CLI_STOP.ordinal());
+		ui.sendMessageDelayed(msg, 100);
+	    }
+	}
+    }
+
+    private void updateStatus(String output) {
+	TextView tStatus = (TextView) findViewById(R.id.textStatus);
+	tStatus.setText(output);        
+    }
+
+    @Override
+    protected void onCreate(Bundle savedInstanceState) {
+	LOG.DEBUG(ui_handler, "=== Activity::onCreate() ===");
+	super.onCreate(savedInstanceState);
+
+	init_view();
+
+	init_lib();
+    }
+
+    @Override
+    protected void onStart() {
+	LOG.DEBUG(ui_handler, "=== Activity::onStart() ===");
+	super.onStart();
+    }
+
+    @Override
+    protected void onRestart() {
+	LOG.DEBUG(ui_handler, "=== Activity::onRestart() ===");
+	super.onRestart();
+    }
+
+    @Override
+    protected void onResume() {
+	LOG.DEBUG(ui_handler, "=== Activity::onResume() ===");
+	super.onResume();
+    }
+
+    @Override
+    protected void onPause() {
+	LOG.DEBUG(ui_handler, "=== Activity::onPause() ===");
+	super.onPause();
+    }
+
+    @Override
+    protected void onStop() {
+	LOG.DEBUG(ui_handler, "=== Activity::onStop() ===");
+	super.onStop();
+    }
+
+    @Override
+    protected void onDestroy() {
+	LOG.DEBUG(ui_handler, "=== Activity::onDestroy() ===");
+	super.onDestroy();
+    }
+
+    @Override
+    protected void onSaveInstanceState(Bundle outState) {
+	super.onSaveInstanceState(outState);
+    }
+
+    @Override
+    protected void onRestoreInstanceState(Bundle savedInstanceState) {
+	super.onRestoreInstanceState(savedInstanceState);
+    }
+
+    private void init_view() {
+	setContentView(R.layout.activity_main);
+    }
+
+    private int init_lib() {        
+	LOG.INFO(ui_handler, "Loading module...");
+
+	// Try loading video dependency libs
+	try {
+	    System.loadLibrary("openh264");
+	    System.loadLibrary("yuv");
+	} catch (UnsatisfiedLinkError e) {
+	    LOG.ERROR(ui_handler, "UnsatisfiedLinkError: " + e.getMessage());
+	    LOG.ERROR(ui_handler, "This could be safely ignored if you "+
+		    		  "don't need video.");
+	}
+
+	// Load pjsua
+	try {
+	    System.loadLibrary(CONST.LIB_FILENAME);
+	} catch (UnsatisfiedLinkError e) {
+	    LOG.ERROR(ui_handler, "UnsatisfiedLinkError: " + e.getMessage());
+	    return -1;
+	}
+
+	// Wait for GDB to init, for native debugging only
+	if (false && (getApplicationInfo().flags & 
+	     	      ApplicationInfo.FLAG_DEBUGGABLE) != 0)
+	{
+	    try {
+		Thread.sleep(5000);
+	    } catch (InterruptedException e) {
+		LOG.ERROR(ui_handler, "InterruptedException: " + 
+			e.getMessage());
+	    }
+	}
+
+	// Set callback object
+	if (callback == null)
+	    callback = new MyCallback(ui_handler);
+
+	pjsua.setCallbackObject(callback);
+
+	SurfaceView surfaceView = (SurfaceView)
+				  findViewById(R.id.surfaceViewIncomingCall);
+	surfaceView.getHolder().addCallback(this);
+
+	LOG.INFO(ui_handler, "Starting module..");
+
+	int rc = pjsua.pjsuaStart();
+
+	if (rc != 0) {
+	    LOG.INFO(ui_handler, "Failed starting telnet");
+	}
+
+	return 0;
+    }
     
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-    	LOG.DEBUG(ui_handler, "=== Activity::onCreate() ===");
-    	super.onCreate(savedInstanceState);
-    	
-    	init_view();
-
-    	init_lib();
-	}
-
-    @Override
-    protected void onStart() {
-    	LOG.DEBUG(ui_handler, "=== Activity::onStart() ===");
-    	super.onStart();
+    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h)
+    {
+	pjsua.setIncomingVideoRenderer(holder.getSurface());
+    }
+
+    public void surfaceCreated(SurfaceHolder holder)
+    {
+	pjsua.setIncomingVideoRenderer(holder.getSurface());
+    }
+
+    public void surfaceDestroyed(SurfaceHolder holder)
+    {
+	pjsua.setIncomingVideoRenderer(null);
     }
     
-    @Override
-    protected void onRestart() {
-    	LOG.DEBUG(ui_handler, "=== Activity::onRestart() ===");
-    	super.onRestart();
-    }
-
-    @Override
-    protected void onResume() {
-    	LOG.DEBUG(ui_handler, "=== Activity::onResume() ===");
-    	super.onResume();
-    }
-
-    @Override
-    protected void onPause() {
-    	LOG.DEBUG(ui_handler, "=== Activity::onPause() ===");
-    	super.onPause();
-    }
-
-    @Override
-    protected void onStop() {
-    	LOG.DEBUG(ui_handler, "=== Activity::onStop() ===");
-    	super.onStop();
-    }
-
-    @Override
-    protected void onDestroy() {
-    	LOG.DEBUG(ui_handler, "=== Activity::onDestroy() ===");
-    	super.onDestroy();
-    }
-    
-    @Override
-    protected void onSaveInstanceState(Bundle outState) {
-		super.onSaveInstanceState(outState);
-    }
-
-    @Override
-    protected void onRestoreInstanceState(Bundle savedInstanceState) {
-		super.onRestoreInstanceState(savedInstanceState);
-    }
-    
-	private void init_view() {
-    	setContentView(R.layout.activity_main);
-	}
-	
-	private int init_lib() {        
-		LOG.INFO(ui_handler, "Loading module...");
-		try {
-			System.loadLibrary(CONST.LIB_FILENAME);
-		} catch (UnsatisfiedLinkError e) {
-			LOG.ERROR(ui_handler, "UnsatisfiedLinkError: " + e.getMessage());
-			return -1;
-		}
-		
-		// Wait for GDB to init
-		if ((getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0) 
-		{
-			try {
-				Thread.sleep(5000);
-	        } catch (InterruptedException e) {
-	        	LOG.ERROR(ui_handler, "InterruptedException: " + 
-	        			  e.getMessage());
-	        }
-		}
-		
-		// Set callback object
-		if (callback == null)
-			callback = new MyCallback(ui_handler);
-		
-		pjsua.setCallbackObject(callback);
-
-		LOG.INFO(ui_handler, "Starting module..");
-
-		int rc = pjsua.pjsuaStart();
-        
-		if (rc != 0) {
-			LOG.INFO(ui_handler, "Failed starting telnet");
-		}
-		
-		return 0;
-	}
 }
Index: /pjproject/trunk/pjsip-apps/src/swig/java/android/src/org/pjsip/pjsua2/app/CallActivity.java
===================================================================
--- /pjproject/trunk/pjsip-apps/src/swig/java/android/src/org/pjsip/pjsua2/app/CallActivity.java	(revision 5013)
+++ /pjproject/trunk/pjsip-apps/src/swig/java/android/src/org/pjsip/pjsua2/app/CallActivity.java	(revision 5014)
@@ -80,5 +80,5 @@
 				vidWH.getHandle().setWindow(null);
 			else
-				vidWH.getHandle().setWindow(pjsua2.android_opengl_get_surface(holder.getSurface()));
+			    	vidWH.getHandle().setWindow(holder.getSurface());
 			try {
 				MainActivity.currentCall.vidWin.setWindow(vidWH);
Index: /pjproject/trunk/pjsip-apps/src/swig/java/android/src/org/pjsip/pjsua2/app/MyApp.java
===================================================================
--- /pjproject/trunk/pjsip-apps/src/swig/java/android/src/org/pjsip/pjsua2/app/MyApp.java	(revision 5013)
+++ /pjproject/trunk/pjsip-apps/src/swig/java/android/src/org/pjsip/pjsua2/app/MyApp.java	(revision 5014)
@@ -21,4 +21,5 @@
 import java.io.File;
 import java.util.ArrayList;
+
 import org.pjsip.pjsua2.*;
 
@@ -244,4 +245,12 @@
 class MyApp {
 	static {
+	    	try{
+		    System.loadLibrary("openh264");
+		    System.loadLibrary("yuv");
+	    	} catch (UnsatisfiedLinkError e) {
+	    	    System.out.println("UnsatisfiedLinkError: " + e.getMessage());
+	    	    System.out.println("This could be safely ignored if you " +
+		    		       "don't need video.");
+	    	}
 		System.loadLibrary("pjsua2");
 		System.out.println("Library loaded");
Index: /pjproject/trunk/pjsip-apps/src/swig/pjsua2.i
===================================================================
--- /pjproject/trunk/pjsip-apps/src/swig/pjsua2.i	(revision 5013)
+++ /pjproject/trunk/pjsip-apps/src/swig/pjsua2.i	(revision 5014)
@@ -102,14 +102,18 @@
 %template(CodecInfoVector)		std::vector<pj::CodecInfo*>;
 
-%include "pjsua2/media.hpp"
-// Create an interface for android_opengl_get_surface()
+/* pj::WindowHandle::setWindow() receives Surface object */
 #if defined(SWIGJAVA) && defined(__ANDROID__)
-%inline %{
-extern "C" {
-    void* android_opengl_get_surface(jobject surface);
+%{#include <android/native_window_jni.h>%}
+%ignore pj::WindowHandle::display;
+%ignore pj::WindowHandle::window;
+%typemap(in) jobject surface {
+    $1 = (jobject)ANativeWindow_fromSurface(jenv, $input);
 }
-%}
+%extend pj::WindowHandle {
+    void setWindow(jobject surface) { $self->window = surface; }
+}
 #endif
 
+%include "pjsua2/media.hpp"
 %include "pjsua2/presence.hpp"
 %include "pjsua2/account.hpp"
