Android NDK之接口统一

来源:互联网 发布:mac上软件卸载不了 编辑:程序博客网 时间:2024/05/02 17:02

        前提:在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;@Overrideprotected 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;@Overridepublic void onCreate() {    netWork = new NetWork(this);    super.onCreate();}@Overridepublic 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接口的统一处理





0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 泰迪肛门腺发炎怎么办 狗狗肛门腺发炎怎么办 狗狗耳朵受伤了怎么办 狗狗的耳朵发热怎么办 头疼带的耳朵疼怎么办 戴眼镜压耳朵疼怎么办 偏头神经跳疼怎么办 脸消肿后有硬块怎么办 拔完智齿好疼怎么办 补过的牙裂了怎么办 补牙后吃冷热疼怎么办 假体下巴肿疼怎么办 左脸疼痛张嘴疼怎么办 一张嘴脸颊会痛怎么办 法斗地包天怎么办 皮肤起小水泡痒怎么办 手臂起小水泡痒怎么办 手背有小水泡痒怎么办 水泡破了很痒怎么办 有一块牙龈肿了怎么办 耳前瘘管有脓怎么办 睡歪脖子很痛怎么办 睡歪脖子怎么办小妙招 睡觉睡得脖子疼怎么办 睡久了后脑勺疼怎么办 腮帮肿了但不疼怎么办 吃硬东西腮帮痛怎么办 嘴巴长开旁边疼怎么办 晚上腿酸睡不着觉怎么办 吃酸的牙齿酸软怎么办 吃酸东西牙齿酸怎么办 拔完智齿神经疼怎么办 22岁腿关节疼痛怎么办 耳洞里面有硬块怎么办 耳洞发炎有硬块怎么办 小孩慢性扁桃体发炎怎么办大全 侧切伤口化脓了怎么办 狗狗伤口不愈合怎么办 狗后腿烂了化脓怎么办 乳腺增生腋下淋巴结肿大怎么办 手术刀口冒脓了怎么办