android java-ril-jni-linux-c-c++
2015-01-22 21:40
288 查看
从上层到底层的一个代码跟踪
http://www.tuicool.com/articles/v6BZzyF
博客园精华区
相似文章 (0)
原文
http://www.cnblogs.com/icxy/p/3953179.html
源码版本:4.4
跳过InCallActivity等UI实现。先看service以及底层。
1, 在frameworks/opt下面会发现如下文件列表:
2, 可以直接进入./telephony/src/java/com/android/internal/telephony/ServiceStateTracker.java 分析,很容易发现类似于如下的代码:
这里主要是结构体的初始化以及上下文环境的简单判断。我们继续追踪notifySignalStrength()
这里有mSignalStrength 和 mLastSignalStrength 两个和信号强度相关的量。算是找到切入点了,信号强度更新的中间点就是这里了。
3,我们先向下分析看有什么可以学习的。 onSignalStrengthResult 是被 frameworks/opt/telephony/src/java/com/android/internal/telephony/gsm/GsmServiceStateTracker.java中handleMessage在Message Type是 EVENT_GET_SIGNAL_STRENGTH的时候调用的:
4, 到这里就需要对RIL有一定的了解才好继续追下去。RIL的event传到上层之后主要通过一个叫做Registrant的机制分发的。
我们跳到frameworks/opt/telephony/src/java/com/android/internal/telephony/RIL.java中去。
这里有主动去得到signalstrength的方法:
继续往下看,接受到底层发来的数据后通过Registrant Notification:
5, 继续追下去,我们看到有主动通过RIL_REQUEST_SIGNAL_STRENGTH去request signal strength的。
所以直接在hardware/ril下搜关键字:RIL_REQUEST_SIGNAL_STRENGTH得到结果如下:
很明显是hardware/ril/reference-ril/reference-ril.c里面如下函数被调用去查询信号强度了,调用AT command等一看便知:
从上层追到下层基本告一段落, Telephony的其他功能的实现结构都一样,也可以同样通过上述思路去追踪。
涉及到的源码路径基本有:
frameworks/av
frameworks/base
frameworks/opt
packages/apps
hardware/ril
等
http://www.tuicool.com/articles/v6BZzyF
Android Telephony —— 手机信号实时变化源码分析过程记录 - 梦溺残沙里
时间 2014-09-03 11:53:00博客园精华区
相似文章 (0)
原文
http://www.cnblogs.com/icxy/p/3953179.html
源码版本:4.4
跳过InCallActivity等UI实现。先看service以及底层。
1, 在frameworks/opt下面会发现如下文件列表:
./telephony/src/java/com/android/internal/telephony/cdma/CdmaServiceStateTracker.java ./telephony/src/java/com/android/internal/telephony/cdma/CdmaLteServiceStateTracker.java ./telephony/src/java/com/android/internal/telephony/gsm/GsmServiceStateTracker.java ./telephony/src/java/com/android/internal/telephony/gsm/GsmLteServiceStateTracker.java ./telephony/src/java/com/android/internal/telephony/ServiceStateTracker.java
2, 可以直接进入./telephony/src/java/com/android/internal/telephony/ServiceStateTracker.java 分析,很容易发现类似于如下的代码:
619 /** 620 * send signal-strength-changed notification if changed Called both for 621 * solicited and unsolicited signal strength updates 622 * 623 * @return true if the signal strength changed and a notification was sent. 624 */ 625 protected boolean onSignalStrengthResult(AsyncResult ar, boolean isGsm) { 626 SignalStrength oldSignalStrength = mSignalStrength; 627 628 // This signal is used for both voice and data radio signal so parse 629 // all fields 630 631 if ((ar.exception == null) && (ar.result != null)) { 632 mSignalStrength = (SignalStrength) ar.result; 633 mSignalStrength.validateInput(); 634 mSignalStrength.setGsm(isGsm); 635 } else { 636 log("onSignalStrengthResult() Exception from RIL : " + ar.exception); 637 mSignalStrength = new SignalStrength(isGsm); 638 } 639 640 return notifySignalStrength(); 641 }
这里主要是结构体的初始化以及上下文环境的简单判断。我们继续追踪notifySignalStrength()
229 private SignalStrength mLastSignalStrength = null; 230 protected boolean notifySignalStrength() { 231 boolean notified = false; 232 synchronized(mCellInfo) { 233 if (!mSignalStrength.equals(mLastSignalStrength)) { 234 try { 235 mPhoneBase.notifySignalStrength(); 236 notified = true; 237 } catch (NullPointerException ex) { 238 loge("updateSignalStrength() Phone already destroyed: " + ex 239 + "SignalStrength not notified"); 240 } 241 } 242 } 243 return notified; 244 }
这里有mSignalStrength 和 mLastSignalStrength 两个和信号强度相关的量。算是找到切入点了,信号强度更新的中间点就是这里了。
3,我们先向下分析看有什么可以学习的。 onSignalStrengthResult 是被 frameworks/opt/telephony/src/java/com/android/internal/telephony/gsm/GsmServiceStateTracker.java中handleMessage在Message Type是 EVENT_GET_SIGNAL_STRENGTH的时候调用的:
424 case EVENT_GET_SIGNAL_STRENGTH: 425 // This callback is called when signal strength is polled 426 // all by itself 427 428 if (!(mCi.getRadioState().isOn())) { 429 // Polling will continue when radio turns back on 430 return; 431 } 432 ar = (AsyncResult) msg.obj; 433 onSignalStrengthResult(ar, true); 434 queueNextSignalStrengthPoll(); 435 436 break;
4, 到这里就需要对RIL有一定的了解才好继续追下去。RIL的event传到上层之后主要通过一个叫做Registrant的机制分发的。
我们跳到frameworks/opt/telephony/src/java/com/android/internal/telephony/RIL.java中去。
这里有主动去得到signalstrength的方法:
1127 getSignalStrength (Message result) { 1128 RILRequest rr 1129 = RILRequest.obtain(RIL_REQUEST_SIGNAL_STRENGTH, result, mIs2ndRil); 1130 1131 if (RILJ_LOGD) riljLog(rr.serialString() + "> " + requestToString(rr.mRequest)); 1132 1133 send(rr); 1134 }
继续往下看,接受到底层发来的数据后通过Registrant Notification:
2811 case RIL_UNSOL_SIGNAL_STRENGTH: 2812 // Note this is set to "verbose" because it happens 2813 // frequently 2814 if (RILJ_LOGV) unsljLogvRet(response, ret); 2815 2816 if (mSignalStrengthRegistrant != null) { 2817 mSignalStrengthRegistrant.notifyRegistrant( 2818 new AsyncResult (null, ret, null)); 2819 } 2820 break;
5, 继续追下去,我们看到有主动通过RIL_REQUEST_SIGNAL_STRENGTH去request signal strength的。
所以直接在hardware/ril下搜关键字:RIL_REQUEST_SIGNAL_STRENGTH得到结果如下:
./include/telephony/ril.h:1388: * RIL_REQUEST_SIGNAL_STRENGTH ./include/telephony/ril.h:1402:#define RIL_REQUEST_SIGNAL_STRENGTH 19 ./libril/ril.cpp:3758: case RIL_REQUEST_SIGNAL_STRENGTH: return "SIGNAL_STRENGTH"; ./libril/ril_commands.h:36: {RIL_REQUEST_SIGNAL_STRENGTH, dispatchVoid, responseRilSignalStrength}, ./reference-ril/reference-ril.c:2093: case RIL_REQUEST_SIGNAL_STRENGTH: ./reference-ril/ril.h:1388: * RIL_REQUEST_SIGNAL_STRENGTH ./reference-ril/ril.h:1402:#define RIL_REQUEST_SIGNAL_STRENGTH 19
很明显是hardware/ril/reference-ril/reference-ril.c里面如下函数被调用去查询信号强度了,调用AT command等一看便知:
839 static void requestSignalStrength(void *data, size_t datalen, RIL_Token t) 840 { 841 ATResponse *p_response = NULL; 842 int err; 843 char *line; 844 int count =0; 845 int numofElements=sizeof(RIL_SignalStrength_v6)/sizeof(int); 846 int response[numofElements]; 847 848 err = at_send_command_singleline("AT+CSQ", "+CSQ:", &p_response); 849 850 if (err < 0 || p_response->success == 0) { 851 RIL_onRequestComplete(t, RIL_E_GENERIC_FAILURE, NULL, 0); 852 goto error; 853 } 854 855 line = p_response->p_intermediates->line; 856 857 err = at_tok_start(&line); 858 if (err < 0) goto error; 859 860 for (count =0; count < numofElements; count ++) { 861 err = at_tok_nextint(&line, &(response[count])); 862 if (err < 0) goto error; 863 } 864 865 RIL_onRequestComplete(t, RIL_E_SUCCESS, response, sizeof(response)); 866 867 at_response_free(p_response); 868 return;
从上层追到下层基本告一段落, Telephony的其他功能的实现结构都一样,也可以同样通过上述思路去追踪。
涉及到的源码路径基本有:
frameworks/av
frameworks/base
frameworks/opt
packages/apps
hardware/ril
等
相关文章推荐
- Linux环境下android平台调试native代码, 从java debug 到C++ (NDK DEBUG)
- Android 在JNI中执行Java方法--C/C++调用Java
- Android JNI通过C++调用JAVA
- Android JNI通过C++调用JAVA
- linux下使用jni实现c++调用java程序(4)DestroyJavaVM出现错误
- [Android] Jni中C++和Java的数据类型的对应关系
- android-JNI学习之java和c++相互调用
- linux下使用jni实现c++调用java程序(1)准备工作
- AndroidJNI 通过C++调用JAVA
- 【书籍资源分享】囊括了Linux,Java,C++以及Android开发
- Android-NDK开发之基础--Android JNI实例代码(一)-- 在JNI中执行Java方法--C/C++调用Java
- Android中简单的JNI使用,C++调用JAVA
- Android JNI 使用的数据结构JNINativeMethod详解 ||建立Android SDK下的JNI、JAVA应用完整步骤---Android JAVA调用C++代码
- linux下使用jni实现c++调用java程序(2)找不到java类的问题
- Android JNI(JNI(JAVA同C++配合使用)
- AndroidJNI 通过C++调用JAVA
- linux下 使用JNI 来以C++调用JAVA的类!(一)
- 转战Android之NDK(jni, c/c++调用java)
- linux下使用jni实现c++调用java程序(5)参考资料总结
- linux下使用jni实现c++调用java程序(3)多线程jni使用