Android NDK之接口统一

        前提:在Android下使用NDK可以完成C++与Java的相互调用,一般是定义一个java类和一个jni C++类去完成C++与java的通信,在java类中声明native方法,然后再jni C++类中去实现,同时可以在jni c++中去回调java类中的方法,随着工程的逐渐增大,activity的增多,在很多acvitiy中都需要这种回调机制,那么如何只在一个java类和一个jni c++类完成所有回调功能呢,具体说明一下:C++层一般是负责网络数据通信,然后把数据传给java层去更新界面,这样就牵涉到更新不同界面的问题,如果每个activity注册一个jni,那么代码的重复性将非常高,而且不利于维护。所以如何统一回调接口是必须解决的问题。下面介绍一种简单实用的方法。

      解决的方法很简单,就是使用回调机制。下面详细说明使用方法:

      假如现在有两个界面  一个是登录界面logonActivity,一个是注册界面registerActivity,登录信息或注册信息发给服务器验证后都会返回给客户端,再由客户端处理结果并提示用户成功与否。我们想要达到的效果是通过一个公用的java类去完成所有ndk的处理,然后通过这个java类去更新不同的activity,需要解决的难点是如何更新不同界面。假设把ndk处理放在NetWork.java类中,有关ndk java与C++相互通信的内容不做介绍,在http://blog.csdn.net/m370809968/article/details/12782667这篇博客里有使用介绍,下面把重点放在如何在NetWork类中去更新不同界面。

     先定义一个接口类:如下

public interface CallBackLogon {
	public void LogonForResult(boolean bSucceed);
}
上面的接口是返回登录结果信息。

然后再activity中去实现该接口,如下:

public class LogonActivity extends Activity implements  CallBackLogon{
private MyApplication application;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_logon);
	    
	    application = (MyApplication)this.getApplication(); 
	    application.GetNetWork().SetCallBackLogon(this);
	}
	public void LogonForResult(boolean bSucceed)
	{
        }
}


这里使用了全局的MyApplication去保存NetWork对象,MyApplication实现如下:

public class MyApplication extends Application {

	private NetWork netWork;
	@Override
	public void onCreate() {
	    netWork = new NetWork(this);
	    super.onCreate();
	}

	@Override
	public void onTerminate() {
	super.onTerminate();
	}
	public NetWork GetNetWork()
	{
		return netWork;
	}
}

NetWork类实现:

public class NetWork {
private CallBackLogon callBackLogon;
private Context _context;
	NetWork(Context context)
	{
		_context = context;
		OnInit();
	}
	
	public void OnInit()
	{
		RegisterJavaNetWorkToJniInterface();
	}
	public void SetCallBackLogon(CallBackLogon info)
	{
		callBackLogon = info;
	}

	public void SendMessageToServer(String strJsonCommand)
	{
		try
		{
			byte[] bGB2312;
			bGB2312 = strJsonCommand.getBytes("UTF-8");
			ParseCommandByByeArray(bGB2312);
		}
		catch (UnsupportedEncodingException e)
		{
			e.printStackTrace();
		}
	}

	
	public native void RegisterJavaNetWorkToJniInterface();
	public native void ParseCommandByByeArray(byte[] bArrayCommand);
	
	static {
		System.loadLibrary("NetWork");
	}
}
上面只是部分NetWork类的关键代码实现,这里还提供一个发送消息的统一接口SendMessageToServer,在任何地方都可以调用该接口去发送json封装的消息包。下面是这个类解析从C++发过来的json数据包的实现

	public void JsonCmdToJava(String strJson)
	{
		try
		{
			JSONObject jsonObject = new JSONObject(strJson);
			int nCmd = jsonObject.getInt("CommandType");
			Log.d("NetWorkInJava", ""+nCmd);
			switch(nCmd)
			{
			case CommandDefine.LOGON_RESULT:
			{
				JSONObject jsonCmd = jsonObject.getJSONObject("stCommand");
				boolean bSucceed = jsonCmd.getBoolean("bSucceed ");
				if(bSucceed )
				{
					callBackLogon.LogonForResult(true);
				}
				else
				{
					callBackLogon.LogonForResult(false);
				}
			}
			break;
			}
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
	}

同理,其他activity界面更新也类似于logonActivity,这样就实现了ndk接口的统一处理





你可能感兴趣的:(android,android,android,ndk,interface)