Android NDK之接口统一

本文探讨了在Android大型项目中,如何避免在多个Activity中重复实现与C++交互的JNI接口,以提高代码复用性和维护性。通过创建一个公共的Java类NetWork,结合接口回调机制,实现了统一的C++到Java的数据通信。具体做法是在NetWork.java中处理NDK通信,并定义一个接口供不同Activity实现,以此更新各自的界面。文章提供了接口定义及Activity实现接口的示例。

        前提:在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.youkuaiyun.com/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接口的统一处理





评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值