IT评测·应用市场-qidao123.com技术社区

标题: Android 体系日志(Log) JNI实现流程源码分析 [打印本页]

作者: 怀念夏天    时间: 2024-6-29 08:48
标题: Android 体系日志(Log) JNI实现流程源码分析
1、JNI概述

Java Native Interface (JNI) 是一种编程框架,使得Java代码可以或许与用其他编程语言(如C和C++)编写的当地代码进行交互。JNI允许Java代码调用当地代码的函数,也允许当地代码调用Java代码的函数。下面是对JNI机制的具体概述,包括其基本原理、工作流程、常见用途和示例代码。
1.1. JNI的基本原理

JNI的核心原理是通过一个标准化的接口,使得Java虚拟机(JVM)和当地代码可以互相通讯和操纵。JNI提供了一套函数,这些函数可以在当地代码中使用,以便与JVM交互,例如创建和操纵Java对象,调用Java方法,处理异常等。
1.2. JNI的工作流程

使用JNI的工作流程通常包括以下几个步调:
1、声明当地方法:在Java类中声明native方法。
2、加载当地库:在Java类中加载包含当地方法实现的库。
3、生成头文件:使用javac和javah工具生成包含native方法声明的头文件。
4、实现当地方法:在C/C++中实现native方法。
5、编译当地库:编译C/C++代码生成共享库。
6、调用当地方法:在Java代码中调用native方法。
1.3. JNI的常见用途

JNI常用于以下几种场景:
1、性能优化:将性能关键的部分用C/C++实现,以提高实验效率。
2、访问底层体系资源:访问操纵体系的底层功能或硬件资源。
3、重用现有库:调用已有的C/C++库或API。
4、实现平台特定功能:在跨平台应用中实现特定平台的功能。
2、JNI的优缺点

2.1、长处

1、性能优化:可以使用高效的当地代码,尤其是在性能关键的部分。
2、硬件访问:可以或许直接访问Java API不提供的底层硬件功能。
3、代码复用:重用现有的C/C++库,无需重新实现复杂的逻辑。
4、多语言互操纵:可以在同一个应用中使用多种编程语言,各取所长。
2.2、缺点

1、复杂性增长:引入了额外的复杂性,必要相识C/C++和JNI API。
2、平台依赖性:当地代码必要针对差别的平台编译,增长了维护成本。
3、内存管理:必要手动管理内存,轻易出现内存泄漏和指针错误。
4、调试困难:调试JNI代码比纯Java代码困难,必要使用特定的工具和方法。
3、JNI的使用场景

1、性能优化:在必要大量盘算或复杂逻辑的地方使用当地代码。
2、硬件功能:访问摄像头、传感器等底层硬件功能。
3、现有库:使用已有的C/C++库,例如图像处理库、加密库等。
4、跨语言调用:在必要与其他编程语言互操纵时,例如从Java调用C++代码。
4、Android日志体系概述

Android日志体系重要由Log类和__android_log_print等C/C++函数构成,提供了记载调试信息的功能。Java层的日志API(如android.util.Log)终极调用的是当地日志函数,这些函数将日志消息写入体系日志缓冲区。
要深入相识Android Log的JNI实现流程,我们必要从JNI机制、Android日志体系、JNI方法实现及其相互配合的细节等方面进行具体分析。
5、当地方法声明(关键字native)

frameworks\base\core\java\android\util\Log.java
  1. /**
  2.      * Checks to see whether or not a log for the specified tag is loggable at the specified level.
  3.      *
  4.      *  The default level of any tag is set to INFO. This means that any level above and including
  5.      *  INFO will be logged. Before you make any calls to a logging method you should check to see
  6.      *  if your tag should be logged. You can change the default level by setting a system property:
  7.      *      'setprop log.tag.<YOUR_LOG_TAG> <LEVEL>'
  8.      *  Where level is either VERBOSE, DEBUG, INFO, WARN, ERROR, ASSERT, or SUPPRESS. SUPPRESS will
  9.      *  turn off all logging for your tag. You can also create a local.prop file that with the
  10.      *  following in it:
  11.      *      'log.tag.<YOUR_LOG_TAG>=<LEVEL>'
  12.      *  and place that in /data/local.prop.
  13.      *
  14.      * @param tag The tag to check.
  15.      * @param level The level to check.
  16.      * @return Whether or not that this is allowed to be logged.
  17.      * @throws IllegalArgumentException is thrown if the tag.length() > 23.
  18.      */
  19.     public static native boolean isLoggable(String tag, int level);
复制代码

  1. /**
  2.      * Low-level logging call.
  3.      * @param priority The priority/type of this log message
  4.      * @param tag Used to identify the source of a log message.  It usually identifies
  5.      *        the class or activity where the log call occurs.
  6.      * @param msg The message you would like logged.
  7.      * @return The number of bytes written.
  8.      */
  9.     public static int println(int priority, String tag, String msg) {
  10.         return println_native(LOG_ID_MAIN, priority, tag, msg);
  11.     }
  12.     /** @hide */ public static final int LOG_ID_MAIN = 0;
  13.     /** @hide */ public static final int LOG_ID_RADIO = 1;
  14.     /** @hide */ public static final int LOG_ID_EVENTS = 2;
  15.     /** @hide */ public static final int LOG_ID_SYSTEM = 3;
  16.     /** @hide */ public static native int println_native(int bufID,
  17.             int priority, String tag, String msg);
复制代码

6、当地方法实现

frameworks\base\core\jni\android_util_Log.cpp
  1. static jboolean android_util_Log_isLoggable(JNIEnv* env, jobject clazz, jstring tag, jint level)
  2. {
  3.     if (tag == NULL) {
  4.         return false;
  5.     }
  6.     const char* chars = env->GetStringUTFChars(tag, NULL);
  7.     if (!chars) {
  8.         return false;
  9.     }
  10.     jboolean result = false;
  11.     if ((strlen(chars)+sizeof(LOG_NAMESPACE)) > PROPERTY_KEY_MAX) {
  12.         char buf2[200];
  13.         snprintf(buf2, sizeof(buf2), "Log tag "%s" exceeds limit of %d characters\n",
  14.                 chars, PROPERTY_KEY_MAX - sizeof(LOG_NAMESPACE));
  15.         jniThrowException(env, "java/lang/IllegalArgumentException", buf2);
  16.     } else {
  17.         result = isLoggable(chars, level);
  18.     }
  19.     env->ReleaseStringUTFChars(tag, chars);
  20.     return result;
  21. }
复制代码

  1. /*
  2. * In class android.util.Log:
  3. *  public static native int println_native(int buffer, int priority, String tag, String msg)
  4. */
  5. static jint android_util_Log_println_native(JNIEnv* env, jobject clazz,
  6.         jint bufID, jint priority, jstring tagObj, jstring msgObj)
  7. {
  8.     const char* tag = NULL;
  9.     const char* msg = NULL;
  10.     if (msgObj == NULL) {
  11.         jniThrowNullPointerException(env, "println needs a message");
  12.         return -1;
  13.     }
  14.     if (bufID < 0 || bufID >= LOG_ID_MAX) {
  15.         jniThrowNullPointerException(env, "bad bufID");
  16.         return -1;
  17.     }
  18.     if (tagObj != NULL)
  19.         tag = env->GetStringUTFChars(tagObj, NULL);
  20.     msg = env->GetStringUTFChars(msgObj, NULL);
  21.     int res = __android_log_buf_write(bufID, (android_LogPriority)priority, tag, msg);
  22.     if (tag != NULL)
  23.         env->ReleaseStringUTFChars(tagObj, tag);
  24.     env->ReleaseStringUTFChars(msgObj, msg);
  25.     return res;
  26. }
复制代码

7、虚拟机里面动态注册

frameworks\base\core\jni\AndroidRuntime.cpp
  1. /*
  2. * Register android native functions with the VM.
  3. */
  4. /*static*/ int AndroidRuntime::startReg(JNIEnv* env)
  5. {
  6.     /*
  7.      * This hook causes all future threads created in this process to be
  8.      * attached to the JavaVM.  (This needs to go away in favor of JNI
  9.      * Attach calls.)
  10.      */
  11.     androidSetCreateThreadFunc((android_create_thread_fn) javaCreateThreadEtc);
  12.     ALOGV("--- registering native functions ---\n");
  13.     /*
  14.      * Every "register" function calls one or more things that return
  15.      * a local reference (e.g. FindClass).  Because we haven't really
  16.      * started the VM yet, they're all getting stored in the base frame
  17.      * and never released.  Use Push/Pop to manage the storage.
  18.      */
  19.     env->PushLocalFrame(200);
  20.     if (register_jni_procs(gRegJNI, NELEM(gRegJNI), env) < 0) {
  21.         env->PopLocalFrame(NULL);
  22.         return -1;
  23.     }
  24.     env->PopLocalFrame(NULL);
  25.     //createJavaThread("fubar", quickTest, (void*) "hello");
  26.     return 0;
  27. }
复制代码

  1. static int register_jni_procs(const RegJNIRec array[], size_t count, JNIEnv* env)
  2. {
  3.     for (size_t i = 0; i < count; i++) {
  4.         if (array[i].mProc(env) < 0) {
  5. #ifndef NDEBUG
  6.             ALOGD("----------!!! %s failed to load\n", array[i].mName);
  7. #endif
  8.             return -1;
  9.         }
  10.     }
  11.     return 0;
  12. }
复制代码

注意传入进来的参数
  1. static const RegJNIRec gRegJNI[] = {
  2.     REG_JNI(register_android_debug_JNITest),
  3.     REG_JNI(register_com_android_internal_os_RuntimeInit),
  4.     REG_JNI(register_android_os_SystemClock),
  5.     REG_JNI(register_android_util_EventLog),
  6.     REG_JNI(register_android_util_Log),
  7.     REG_JNI(register_android_util_FloatMath),
  8.     REG_JNI(register_android_text_format_Time),
  9.     REG_JNI(register_android_content_AssetManager),
  10.     REG_JNI(register_android_content_StringBlock),
  11.     REG_JNI(register_android_content_XmlBlock),
  12.     REG_JNI(register_android_emoji_EmojiFactory),
  13.     REG_JNI(register_android_text_AndroidCharacter),
  14.     REG_JNI(register_android_text_AndroidBidi),
  15.     REG_JNI(register_android_view_InputDevice),
  16.     REG_JNI(register_android_view_KeyCharacterMap),
  17.     REG_JNI(register_android_os_Process),
  18.     REG_JNI(register_android_os_SystemProperties),
  19.     REG_JNI(register_android_os_Binder),
  20.     REG_JNI(register_android_os_Parcel),
  21.     REG_JNI(register_android_view_DisplayEventReceiver),
  22.     REG_JNI(register_android_nio_utils),
  23.     REG_JNI(register_android_graphics_PixelFormat),
  24.     REG_JNI(register_android_graphics_Graphics),
  25.     REG_JNI(register_android_view_GLES20DisplayList),
  26.     REG_JNI(register_android_view_GLES20Canvas),
  27.     REG_JNI(register_android_view_HardwareRenderer),
  28.     REG_JNI(register_android_view_Surface),
  29.     REG_JNI(register_android_view_SurfaceSession),
  30.     REG_JNI(register_android_view_TextureView),
  31.     REG_JNI(register_com_google_android_gles_jni_EGLImpl),
  32.     REG_JNI(register_com_google_android_gles_jni_GLImpl),
  33.     REG_JNI(register_android_opengl_jni_EGL14),
  34.     REG_JNI(register_android_opengl_jni_GLES10),
  35.     REG_JNI(register_android_opengl_jni_GLES10Ext),
  36.     REG_JNI(register_android_opengl_jni_GLES11),
  37.     REG_JNI(register_android_opengl_jni_GLES11Ext),
  38.     REG_JNI(register_android_opengl_jni_GLES20),
  39.     REG_JNI(register_android_graphics_Bitmap),
  40.     REG_JNI(register_android_graphics_BitmapFactory),
  41.     REG_JNI(register_android_graphics_BitmapRegionDecoder),
  42.     REG_JNI(register_android_graphics_Camera),
  43.     REG_JNI(register_android_graphics_Canvas),
  44.     REG_JNI(register_android_graphics_ColorFilter),
  45.     REG_JNI(register_android_graphics_DrawFilter),
  46.     REG_JNI(register_android_graphics_Interpolator),
  47.     REG_JNI(register_android_graphics_LayerRasterizer),
  48.     REG_JNI(register_android_graphics_MaskFilter),
  49.     REG_JNI(register_android_graphics_Matrix),
  50.     REG_JNI(register_android_graphics_Movie),
  51.     REG_JNI(register_android_graphics_NinePatch),
  52.     REG_JNI(register_android_graphics_Paint),
  53.     REG_JNI(register_android_graphics_Path),
  54.     REG_JNI(register_android_graphics_PathMeasure),
  55.     REG_JNI(register_android_graphics_PathEffect),
  56.     REG_JNI(register_android_graphics_Picture),
  57.     REG_JNI(register_android_graphics_PorterDuff),
  58.     REG_JNI(register_android_graphics_Rasterizer),
  59.     REG_JNI(register_android_graphics_Region),
  60.     REG_JNI(register_android_graphics_Shader),
  61.     REG_JNI(register_android_graphics_SurfaceTexture),
  62.     REG_JNI(register_android_graphics_Typeface),
  63.     REG_JNI(register_android_graphics_Xfermode),
  64.     REG_JNI(register_android_graphics_YuvImage),
  65.     REG_JNI(register_android_database_CursorWindow),
  66.     REG_JNI(register_android_database_SQLiteConnection),
  67.     REG_JNI(register_android_database_SQLiteGlobal),
  68.     REG_JNI(register_android_database_SQLiteDebug),
  69.     REG_JNI(register_android_os_Debug),
  70.     REG_JNI(register_android_os_FileObserver),
  71.     REG_JNI(register_android_os_FileUtils),
  72.     REG_JNI(register_android_os_MessageQueue),
  73.     REG_JNI(register_android_os_ParcelFileDescriptor),
  74.     REG_JNI(register_android_os_SELinux),
  75.     REG_JNI(register_android_os_Trace),
  76.     REG_JNI(register_android_os_UEventObserver),
  77.     REG_JNI(register_android_net_LocalSocketImpl),
  78.     REG_JNI(register_android_net_NetworkUtils),
  79.     REG_JNI(register_android_net_TrafficStats),
  80.     REG_JNI(register_android_net_wifi_WifiManager),
  81.     REG_JNI(register_android_os_MemoryFile),
  82.     REG_JNI(register_com_android_internal_os_ZygoteInit),
  83.     REG_JNI(register_android_hardware_Camera),
  84.     REG_JNI(register_android_hardware_SensorManager),
  85.     REG_JNI(register_android_hardware_SerialPort),
  86.     REG_JNI(register_android_hardware_UsbDevice),
  87.     REG_JNI(register_android_hardware_UsbDeviceConnection),
  88.     REG_JNI(register_android_hardware_UsbRequest),
  89.     REG_JNI(register_android_media_AudioRecord),
  90.     REG_JNI(register_android_media_AudioSystem),
  91.     REG_JNI(register_android_media_AudioTrack),
  92.     REG_JNI(register_android_media_JetPlayer),
  93.     REG_JNI(register_android_media_RemoteDisplay),
  94.     REG_JNI(register_android_media_ToneGenerator),
  95.     REG_JNI(register_android_opengl_classes),
  96.     REG_JNI(register_android_server_NetworkManagementSocketTagger),
  97.     REG_JNI(register_android_server_Watchdog),
  98.     REG_JNI(register_android_ddm_DdmHandleNativeHeap),
  99.     REG_JNI(register_android_backup_BackupDataInput),
  100.     REG_JNI(register_android_backup_BackupDataOutput),
  101.     REG_JNI(register_android_backup_FileBackupHelperBase),
  102.     REG_JNI(register_android_backup_BackupHelperDispatcher),
  103.     REG_JNI(register_android_app_backup_FullBackup),
  104.     REG_JNI(register_android_app_ActivityThread),
  105.     REG_JNI(register_android_app_NativeActivity),
  106.     REG_JNI(register_android_view_InputChannel),
  107.     REG_JNI(register_android_view_InputEventReceiver),
  108.     REG_JNI(register_android_view_KeyEvent),
  109.     REG_JNI(register_android_view_MotionEvent),
  110.     REG_JNI(register_android_view_PointerIcon),
  111.     REG_JNI(register_android_view_VelocityTracker),
  112.     REG_JNI(register_android_content_res_ObbScanner),
  113.     REG_JNI(register_android_content_res_Configuration),
  114.     REG_JNI(register_android_animation_PropertyValuesHolder),
  115.     REG_JNI(register_com_android_internal_content_NativeLibraryHelper),
  116. };
复制代码

看到register_android_util_Log了吧
  1. int register_android_util_Log(JNIEnv* env)
  2. {
  3.     jclass clazz = env->FindClass("android/util/Log");
  4.     if (clazz == NULL) {
  5.         ALOGE("Can't find android/util/Log");
  6.         return -1;
  7.     }
  8.     levels.verbose = env->GetStaticIntField(clazz, env->GetStaticFieldID(clazz, "VERBOSE", "I"));
  9.     levels.debug = env->GetStaticIntField(clazz, env->GetStaticFieldID(clazz, "DEBUG", "I"));
  10.     levels.info = env->GetStaticIntField(clazz, env->GetStaticFieldID(clazz, "INFO", "I"));
  11.     levels.warn = env->GetStaticIntField(clazz, env->GetStaticFieldID(clazz, "WARN", "I"));
  12.     levels.error = env->GetStaticIntField(clazz, env->GetStaticFieldID(clazz, "ERROR", "I"));
  13.     levels.assert = env->GetStaticIntField(clazz, env->GetStaticFieldID(clazz, "ASSERT", "I"));
  14.     return AndroidRuntime::registerNativeMethods(env, "android/util/Log", gMethods, NELEM(gMethods));
  15. }
复制代码

动态注册完成,那共享库(.so)是在哪里加载的呢?
8、共享库加载

看当地实现文件的mk:frameworks\base\core\jni
  1. LOCAL_SRC_FILES:= \
  2.         AndroidRuntime.cpp \
  3.         Time.cpp \
  4.         com_android_internal_content_NativeLibraryHelper.cpp \
  5.         com_google_android_gles_jni_EGLImpl.cpp \
  6.         com_google_android_gles_jni_GLImpl.cpp.arm \
  7.         android_app_NativeActivity.cpp \
  8.         android_opengl_EGL14.cpp \
  9.         android_opengl_GLES10.cpp \
  10.         android_opengl_GLES10Ext.cpp \
  11.         android_opengl_GLES11.cpp \
  12.         android_opengl_GLES11Ext.cpp \
  13.         android_opengl_GLES20.cpp \
  14.         android_database_CursorWindow.cpp \
  15.         android_database_SQLiteCommon.cpp \
  16.         android_database_SQLiteConnection.cpp \
  17.         android_database_SQLiteGlobal.cpp \
  18.         android_database_SQLiteDebug.cpp \
  19.         android_emoji_EmojiFactory.cpp \
  20.         android_view_DisplayEventReceiver.cpp \
  21.         android_view_Surface.cpp \
  22.         android_view_SurfaceSession.cpp \
  23.         android_view_TextureView.cpp \
  24.         android_view_InputChannel.cpp \
  25.         android_view_InputDevice.cpp \
  26.         android_view_InputEventReceiver.cpp \
  27.         android_view_KeyEvent.cpp \
  28.         android_view_KeyCharacterMap.cpp \
  29.         android_view_HardwareRenderer.cpp \
  30.         android_view_GLES20DisplayList.cpp \
  31.         android_view_GLES20Canvas.cpp \
  32.         android_view_MotionEvent.cpp \
  33.         android_view_PointerIcon.cpp \
  34.         android_view_VelocityTracker.cpp \
  35.         android_text_AndroidCharacter.cpp \
  36.         android_text_AndroidBidi.cpp \
  37.         android_os_Debug.cpp \
  38.         android_os_FileUtils.cpp \
  39.         android_os_MemoryFile.cpp \
  40.         android_os_MessageQueue.cpp \
  41.         android_os_ParcelFileDescriptor.cpp \
  42.         android_os_Parcel.cpp \
  43.         android_os_SELinux.cpp \
  44.         android_os_SystemClock.cpp \
  45.         android_os_SystemProperties.cpp \
  46.         android_os_Trace.cpp \
  47.         android_os_UEventObserver.cpp \
  48.         android_net_LocalSocketImpl.cpp \
  49.         android_net_NetUtils.cpp \
  50.         android_net_TrafficStats.cpp \
  51.         android_net_wifi_Wifi.cpp \
  52.         android_nio_utils.cpp \
  53.         android_text_format_Time.cpp \
  54.         android_util_AssetManager.cpp \
  55.         android_util_Binder.cpp \
  56.         android_util_EventLog.cpp \
  57.         android_util_Log.cpp \
  58.         android_util_FloatMath.cpp \
  59.         android_util_Process.cpp \
  60.         android_util_StringBlock.cpp \
  61.         android_util_XmlBlock.cpp \
  62.         android/graphics/AutoDecodeCancel.cpp \
  63.         android/graphics/Bitmap.cpp \
  64.         android/graphics/BitmapFactory.cpp \
  65.         android/graphics/Camera.cpp \
  66.         android/graphics/Canvas.cpp \
  67.         android/graphics/ColorFilter.cpp \
  68.         android/graphics/DrawFilter.cpp \
  69.         android/graphics/CreateJavaOutputStreamAdaptor.cpp \
  70.         android/graphics/Graphics.cpp \
  71.         android/graphics/HarfbuzzSkia.cpp \
  72.         android/graphics/Interpolator.cpp \
  73.         android/graphics/LayerRasterizer.cpp \
  74.         android/graphics/MaskFilter.cpp \
  75.         android/graphics/Matrix.cpp \
  76.         android/graphics/Movie.cpp \
  77.         android/graphics/NinePatch.cpp \
  78.         android/graphics/NinePatchImpl.cpp \
  79.         android/graphics/NinePatchPeeker.cpp \
  80.         android/graphics/Paint.cpp \
  81.         android/graphics/Path.cpp \
  82.         android/graphics/PathMeasure.cpp \
  83.         android/graphics/PathEffect.cpp \
  84.         android_graphics_PixelFormat.cpp \
  85.         android/graphics/Picture.cpp \
  86.         android/graphics/PorterDuff.cpp \
  87.         android/graphics/BitmapRegionDecoder.cpp \
  88.         android/graphics/Rasterizer.cpp \
  89.         android/graphics/Region.cpp \
  90.         android/graphics/Shader.cpp \
  91.         android/graphics/SurfaceTexture.cpp \
  92.         android/graphics/TextLayout.cpp \
  93.         android/graphics/TextLayoutCache.cpp \
  94.         android/graphics/Typeface.cpp \
  95.         android/graphics/Utils.cpp \
  96.         android/graphics/Xfermode.cpp \
  97.         android/graphics/YuvToJpegEncoder.cpp \
  98.         android_media_AudioRecord.cpp \
  99.         android_media_AudioSystem.cpp \
  100.         android_media_AudioTrack.cpp \
  101.         android_media_JetPlayer.cpp \
  102.         android_media_RemoteDisplay.cpp \
  103.         android_media_ToneGenerator.cpp \
  104.         android_hardware_Camera.cpp \
  105.         android_hardware_SensorManager.cpp \
  106.         android_hardware_SerialPort.cpp \
  107.         android_hardware_UsbDevice.cpp \
  108.         android_hardware_UsbDeviceConnection.cpp \
  109.         android_hardware_UsbRequest.cpp \
  110.         android_debug_JNITest.cpp \
  111.         android_util_FileObserver.cpp \
  112.         android/opengl/poly_clip.cpp.arm \
  113.         android/opengl/util.cpp.arm \
  114.         android_server_NetworkManagementSocketTagger.cpp \
  115.         android_server_Watchdog.cpp \
  116.         android_ddm_DdmHandleNativeHeap.cpp \
  117.         com_android_internal_os_ZygoteInit.cpp \
  118.         android_backup_BackupDataInput.cpp \
  119.         android_backup_BackupDataOutput.cpp \
  120.         android_backup_FileBackupHelperBase.cpp \
  121.         android_backup_BackupHelperDispatcher.cpp \
  122.         android_app_backup_FullBackup.cpp \
  123.         android_content_res_ObbScanner.cpp \
  124.         android_content_res_Configuration.cpp \
  125.     android_animation_PropertyValuesHolder.cpp
复制代码

编译的共享库为:LOCAL_MODULE:= libandroid_runtime
  1. ifeq ($(HAVE_SELINUX),true)
  2. LOCAL_C_INCLUDES += external/libselinux/include
  3. LOCAL_SHARED_LIBRARIES += libselinux
  4. LOCAL_CFLAGS += -DHAVE_SELINUX
  5. endif # HAVE_SELINUX
  6. ifeq ($(USE_OPENGL_RENDERER),true)
  7.         LOCAL_SHARED_LIBRARIES += libhwui
  8. endif
  9. LOCAL_SHARED_LIBRARIES += \
  10.         libdl
  11. # we need to access the private Bionic header
  12. # <bionic_tls.h> in com_google_android_gles_jni_GLImpl.cpp
  13. LOCAL_CFLAGS += -I$(LOCAL_PATH)/../../../../bionic/libc/private
  14. LOCAL_LDLIBS += -lpthread -ldl
  15. ifeq ($(WITH_MALLOC_LEAK_CHECK),true)
  16.         LOCAL_CFLAGS += -DMALLOC_LEAK_CHECK
  17. endif
  18. LOCAL_MODULE:= libandroid_runtime
  19. include $(BUILD_SHARED_LIBRARY)
  20. include $(call all-makefiles-under,$(LOCAL_PATH))
复制代码

而共享库LOCAL_MODULE:= libandroid_runtime又被编译到另一个共享库:LOCAL_MODULE:= libandroid_servers
frameworks\base\services\jni:
  1. LOCAL_PATH:= $(call my-dir)
  2. include $(CLEAR_VARS)
  3. LOCAL_SRC_FILES:= \
  4.     com_android_server_AlarmManagerService.cpp \
  5.     com_android_server_BatteryService.cpp \
  6.     com_android_server_input_InputApplicationHandle.cpp \
  7.     com_android_server_input_InputManagerService.cpp \
  8.     com_android_server_input_InputWindowHandle.cpp \
  9.     com_android_server_LightsService.cpp \
  10.     com_android_server_power_PowerManagerService.cpp \
  11.     com_android_server_SerialService.cpp \
  12.     com_android_server_SystemServer.cpp \
  13.     com_android_server_UsbDeviceManager.cpp \
  14.     com_android_server_UsbHostManager.cpp \
  15.     com_android_server_VibratorService.cpp \
  16.     com_android_server_location_GpsLocationProvider.cpp \
  17.     com_android_server_connectivity_Vpn.cpp \
  18.     onload.cpp
  19. LOCAL_C_INCLUDES += \
  20.     $(JNI_H_INCLUDE) \
  21.     frameworks/base/services \
  22.     frameworks/base/core/jni \
  23.     external/skia/include/core \
  24.     libcore/include \
  25.     libcore/include/libsuspend \
  26.         $(call include-path-for, libhardware)/hardware \
  27.         $(call include-path-for, libhardware_legacy)/hardware_legacy \
  28. LOCAL_SHARED_LIBRARIES := \
  29.     libandroid_runtime \
  30.     libandroidfw \
  31.     libcutils \
  32.     libhardware \
  33.     libhardware_legacy \
  34.     libnativehelper \
  35.     libsystem_server \
  36.     libutils \
  37.     libui \
  38.     libinput \
  39.     libskia \
  40.     libgui \
  41.     libusbhost \
  42.     libsuspend
  43. ifeq ($(WITH_MALLOC_LEAK_CHECK),true)
  44.     LOCAL_CFLAGS += -DMALLOC_LEAK_CHECK
  45. endif
  46. LOCAL_MODULE:= libandroid_servers
  47. include $(BUILD_SHARED_LIBRARY)
复制代码

那就看共享库libandroid_servers是在那边加载的吧!
frameworks\base\services\java\com\android\server
  1. public static void main(String[] args) {
  2.         if (System.currentTimeMillis() < EARLIEST_SUPPORTED_TIME) {
  3.             // If a device's clock is before 1970 (before 0), a lot of
  4.             // APIs crash dealing with negative numbers, notably
  5.             // java.io.File#setLastModified, so instead we fake it and
  6.             // hope that time from cell towers or NTP fixes it
  7.             // shortly.
  8.             Slog.w(TAG, "System clock is before 1970; setting to 1970.");
  9.             SystemClock.setCurrentTimeMillis(EARLIEST_SUPPORTED_TIME);
  10.         }
  11.         if (SamplingProfilerIntegration.isEnabled()) {
  12.             SamplingProfilerIntegration.start();
  13.             timer = new Timer();
  14.             timer.schedule(new TimerTask() {
  15.                 @Override
  16.                 public void run() {
  17.                     SamplingProfilerIntegration.writeSnapshot("system_server", null);
  18.                 }
  19.             }, SNAPSHOT_INTERVAL, SNAPSHOT_INTERVAL);
  20.         }
  21.         // Mmmmmm... more memory!
  22.         dalvik.system.VMRuntime.getRuntime().clearGrowthLimit();
  23.         // The system server has to run all of the time, so it needs to be
  24.         // as efficient as possible with its memory usage.
  25.         VMRuntime.getRuntime().setTargetHeapUtilization(0.8f);
  26.         System.loadLibrary("android_servers");
  27.         init1(args);
  28.     }
复制代码

现在知道Log的JNI实现流程了吧?!!!
9、总结

JNI是Android开发中的一个重要工具,提供了Java代码与当地代码之间的桥梁。通过JNI,开发者可以在Java代码中调用高效的当地代码,访问特定硬件功能,以及重用现有的C/C++库。理解JNI的工作原理和使用方法,对于开发高性能、功能丰富的Android应用至关重要。
JNI(Java Native Interface)是Java平台的重要构成部分,允许Java代码与当地(通常是C/C++)代码进行互操纵。在Android开发中,JNI广泛应用于性能优化、硬件访问以及重用现有的当地库。以下是关于JNI使用的总结,包括其优缺点、使用场景、开发步调、注意事项以及最佳实践。
Android日志体系从应用步调层到JNI层、当地层、Logd保卫历程,再到Logcat工具,形成了一个完整的日志记载与查看的流程。通过分析各个层级的代码实现,可以更深入地理解日志体系的设计和工作原理。这些组件精密协作,提供了一个高效、可靠的日志记载和查看机制,资助开发者调试和监控应用步调。
欢迎点赞|关注|收藏|评论,您的肯定是我创作的动力


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com技术社区 (https://dis.qidao123.com/) Powered by Discuz! X3.4