传感器等底层硬件功能
发布时间:2025-06-24 20:27:43 作者:北方职教升学中心 阅读量:694
现有库:使用已有的C/C++库,例如图像处理库、
1.3. JNI的常见用途
JNI常用于以下几种场景:
1、声明本地方法:在Java类中声明native方法。
4、以下是关于JNI使用的总结,包括其优缺点、
Android日志系统从应用程序层到JNI层、
3、通过JNI,开发者可以在Java代码中调用高效的本地代码,访问特定硬件功能,以及重用现有的C/C++库。实现平台特定功能:在跨平台应用中实现特定平台的功能。共享库加载
看本地实现文件的mk:frameworks\base\core\jni
LOCAL_SRC_FILES:= \ AndroidRuntime.cpp\ Time.cpp\ com_android_internal_content_NativeLibraryHelper.cpp\ com_google_android_gles_jni_EGLImpl.cpp\ com_google_android_gles_jni_GLImpl.cpp.arm \ android_app_NativeActivity.cpp\ android_opengl_EGL14.cpp\ android_opengl_GLES10.cpp\ android_opengl_GLES10Ext.cpp\ android_opengl_GLES11.cpp\ android_opengl_GLES11Ext.cpp\ android_opengl_GLES20.cpp\ android_database_CursorWindow.cpp\ android_database_SQLiteCommon.cpp\ android_database_SQLiteConnection.cpp\ android_database_SQLiteGlobal.cpp\ android_database_SQLiteDebug.cpp\ android_emoji_EmojiFactory.cpp\ android_view_DisplayEventReceiver.cpp\ android_view_Surface.cpp\ android_view_SurfaceSession.cpp\ android_view_TextureView.cpp\ android_view_InputChannel.cpp\ android_view_InputDevice.cpp\ android_view_InputEventReceiver.cpp\ android_view_KeyEvent.cpp\ android_view_KeyCharacterMap.cpp\ android_view_HardwareRenderer.cpp\ android_view_GLES20DisplayList.cpp\ android_view_GLES20Canvas.cpp\ android_view_MotionEvent.cpp\ android_view_PointerIcon.cpp\ android_view_VelocityTracker.cpp\ android_text_AndroidCharacter.cpp\ android_text_AndroidBidi.cpp\ android_os_Debug.cpp\ android_os_FileUtils.cpp\ android_os_MemoryFile.cpp\ android_os_MessageQueue.cpp\ android_os_ParcelFileDescriptor.cpp\ android_os_Parcel.cpp\ android_os_SELinux.cpp\ android_os_SystemClock.cpp\ android_os_SystemProperties.cpp\ android_os_Trace.cpp\ android_os_UEventObserver.cpp\ android_net_LocalSocketImpl.cpp\ android_net_NetUtils.cpp\ android_net_TrafficStats.cpp\ android_net_wifi_Wifi.cpp\ android_nio_utils.cpp\ android_text_format_Time.cpp\ android_util_AssetManager.cpp\ android_util_Binder.cpp\ android_util_EventLog.cpp\ android_util_Log.cpp\ android_util_FloatMath.cpp\ android_util_Process.cpp\ android_util_StringBlock.cpp\ android_util_XmlBlock.cpp\ android/graphics/AutoDecodeCancel.cpp\ android/graphics/Bitmap.cpp\ android/graphics/BitmapFactory.cpp\ android/graphics/Camera.cpp\ android/graphics/Canvas.cpp\ android/graphics/ColorFilter.cpp\ android/graphics/DrawFilter.cpp\ android/graphics/CreateJavaOutputStreamAdaptor.cpp\ android/graphics/Graphics.cpp\ android/graphics/HarfbuzzSkia.cpp\ android/graphics/Interpolator.cpp\ android/graphics/LayerRasterizer.cpp\ android/graphics/MaskFilter.cpp\ android/graphics/Matrix.cpp\ android/graphics/Movie.cpp\ android/graphics/NinePatch.cpp\ android/graphics/NinePatchImpl.cpp\ android/graphics/NinePatchPeeker.cpp\ android/graphics/Paint.cpp\ android/graphics/Path.cpp\ android/graphics/PathMeasure.cpp\ android/graphics/PathEffect.cpp\ android_graphics_PixelFormat.cpp\ android/graphics/Picture.cpp\ android/graphics/PorterDuff.cpp\ android/graphics/BitmapRegionDecoder.cpp\ android/graphics/Rasterizer.cpp\ android/graphics/Region.cpp\ android/graphics/Shader.cpp\ android/graphics/SurfaceTexture.cpp\ android/graphics/TextLayout.cpp\ android/graphics/TextLayoutCache.cpp\ android/graphics/Typeface.cpp\ android/graphics/Utils.cpp\ android/graphics/Xfermode.cpp\ android/graphics/YuvToJpegEncoder.cpp\ android_media_AudioRecord.cpp\ android_media_AudioSystem.cpp\ android_media_AudioTrack.cpp\ android_media_JetPlayer.cpp\ android_media_RemoteDisplay.cpp\ android_media_ToneGenerator.cpp\ android_hardware_Camera.cpp\ android_hardware_SensorManager.cpp\ android_hardware_SerialPort.cpp\ android_hardware_UsbDevice.cpp\ android_hardware_UsbDeviceConnection.cpp\ android_hardware_UsbRequest.cpp\ android_debug_JNITest.cpp\ android_util_FileObserver.cpp\ android/opengl/poly_clip.cpp.arm \ android/opengl/util.cpp.arm \ android_server_NetworkManagementSocketTagger.cpp\ android_server_Watchdog.cpp\ android_ddm_DdmHandleNativeHeap.cpp\ com_android_internal_os_ZygoteInit.cpp\ android_backup_BackupDataInput.cpp\ android_backup_BackupDataOutput.cpp\ android_backup_FileBackupHelperBase.cpp\ android_backup_BackupHelperDispatcher.cpp\ android_app_backup_FullBackup.cpp\ android_content_res_ObbScanner.cpp\ android_content_res_Configuration.cpp\ android_animation_PropertyValuesHolder.cpp
编译的共享库为:LOCAL_MODULE:= libandroid_runtime
ifeq ($(HAVE_SELINUX),true)LOCAL_C_INCLUDES +=external/libselinux/includeLOCAL_SHARED_LIBRARIES +=libselinuxLOCAL_CFLAGS +=-DHAVE_SELINUXendif # HAVE_SELINUXifeq ($(USE_OPENGL_RENDERER),true)LOCAL_SHARED_LIBRARIES +=libhwuiendifLOCAL_SHARED_LIBRARIES +=\ libdl# we need to access the private Bionic header# <bionic_tls.h> in com_google_android_gles_jni_GLImpl.cppLOCAL_CFLAGS +=-I$(LOCAL_PATH)/../../../../bionic/libc/privateLOCAL_LDLIBS +=-lpthread -ldlifeq ($(WITH_MALLOC_LEAK_CHECK),true)LOCAL_CFLAGS +=-DMALLOC_LEAK_CHECKendifLOCAL_MODULE:= libandroid_runtimeinclude $(BUILD_SHARED_LIBRARY)include $(call all-makefiles-under,$(LOCAL_PATH))
而共享库LOCAL_MODULE:= libandroid_runtime又被编译到另一个共享库:LOCAL_MODULE:= libandroid_servers
frameworks\base\services\jni:
LOCAL_PATH:= $(call my-dir)include $(CLEAR_VARS)LOCAL_SRC_FILES:= \ com_android_server_AlarmManagerService.cpp\ com_android_server_BatteryService.cpp\ com_android_server_input_InputApplicationHandle.cpp\ com_android_server_input_InputManagerService.cpp\ com_android_server_input_InputWindowHandle.cpp\ com_android_server_LightsService.cpp\ com_android_server_power_PowerManagerService.cpp\ com_android_server_SerialService.cpp\ com_android_server_SystemServer.cpp\ com_android_server_UsbDeviceManager.cpp\ com_android_server_UsbHostManager.cpp\ com_android_server_VibratorService.cpp\ com_android_server_location_GpsLocationProvider.cpp\ com_android_server_connectivity_Vpn.cpp\ onload.cppLOCAL_C_INCLUDES +=\ $(JNI_H_INCLUDE)\ frameworks/base/services \ frameworks/base/core/jni \ external/skia/include/core \ libcore/include \ libcore/include/libsuspend \ $(call include-path-for,libhardware)/hardware \ $(call include-path-for,libhardware_legacy)/hardware_legacy \LOCAL_SHARED_LIBRARIES := \ libandroid_runtime \ libandroidfw \ libcutils \ libhardware \ libhardware_legacy \ libnativehelper \ libsystem_server \ libutils \ libui \ libinput \ libskia \ libgui \ libusbhost \ libsuspendifeq ($(WITH_MALLOC_LEAK_CHECK),true)LOCAL_CFLAGS +=-DMALLOC_LEAK_CHECKendifLOCAL_MODULE:= libandroid_serversinclude $(BUILD_SHARED_LIBRARY)
那就看共享库libandroid_servers是在那里加载的吧!
frameworks\base\services\java\com\android\server
publicstaticvoidmain(String[]args){if(System.currentTimeMillis()<EARLIEST_SUPPORTED_TIME){// If a device's clock is before 1970 (before 0), a lot of// APIs crash dealing with negative numbers, notably// java.io.File#setLastModified, so instead we fake it and// hope that time from cell towers or NTP fixes it// shortly.Slog.w(TAG,"System clock is before 1970; setting to 1970.");SystemClock.setCurrentTimeMillis(EARLIEST_SUPPORTED_TIME);}if(SamplingProfilerIntegration.isEnabled()){SamplingProfilerIntegration.start();timer =newTimer();timer.schedule(newTimerTask(){@Overridepublicvoidrun(){SamplingProfilerIntegration.writeSnapshot("system_server",null);}},SNAPSHOT_INTERVAL,SNAPSHOT_INTERVAL);}// Mmmmmm... more memory!dalvik.system.VMRuntime.getRuntime().clearGrowthLimit();// The system server has to run all of the time, so it needs to be// as efficient as possible with its memory usage.VMRuntime.getRuntime().setTargetHeapUtilization(0.8f);System.loadLibrary("android_servers");init1(args);}
现在知道Log的JNI实现流程了吧?!!!
9、
4、平台依赖性:本地代码需要针对不同的平台编译,增加了维护成本。4、性能优化:将性能关键的部分用C/C++实现,以提高执行效率。理解JNI的工作原理和使用方法,对于开发高性能、硬件访问以及重用现有的本地库。访问底层系统资源:访问操作系统的底层功能或硬件资源。缺点
1、
1.2. JNI的工作流程
使用JNI的工作流程通常包括以下几个步骤:
1、多语言互操作:可以在同一个应用中使用多种编程语言,各取所长。
6、
3、本地层、本地方法实现
frameworks\base\core\jni\android_util_Log.cpp
staticjboolean android_util_Log_isLoggable(JNIEnv*env,jobject clazz,jstring tag,jint level){if(tag ==NULL){returnfalse;}constchar*chars =env->GetStringUTFChars(tag,NULL);if(!chars){returnfalse;}jboolean result =false;if((strlen(chars)+sizeof(LOG_NAMESPACE))>PROPERTY_KEY_MAX){charbuf2[200];snprintf(buf2,sizeof(buf2),"Log tag "%s" exceeds limit of %d charactersn",chars,PROPERTY_KEY_MAX -sizeof(LOG_NAMESPACE));jniThrowException(env,"java/lang/IllegalArgumentException",buf2);}else{result =isLoggable(chars,level);}env->ReleaseStringUTFChars(tag,chars);returnresult;}
/* * In class android.util.Log: * public static native int println_native(int buffer, int priority, String tag, String msg) */staticjint android_util_Log_println_native(JNIEnv*env,jobject clazz,jint bufID,jint priority,jstring tagObj,jstring msgObj){constchar*tag =NULL;constchar*msg =NULL;if(msgObj ==NULL){jniThrowNullPointerException(env,"println needs a message");return-1;}if(bufID <0||bufID >=LOG_ID_MAX){jniThrowNullPointerException(env,"bad bufID");return-1;}if(tagObj !=NULL)tag =env->GetStringUTFChars(tagObj,NULL);msg =env->GetStringUTFChars(msgObj,NULL);intres =__android_log_buf_write(bufID,(android_LogPriority)priority,tag,msg);if(tag !=NULL)env->ReleaseStringUTFChars(tagObj,tag);env->ReleaseStringUTFChars(msgObj,msg);returnres;}
7、功能丰富的Android应用至关重要。总结
JNI是Android开发中的一个重要工具,提供了Java代码与本地代码之间的桥梁。Logd守护进程,再到Logcat工具,形成了一个完整的日志记录与查看的流程。
4、
4、内存管理:需要手动管理内存,容易出现内存泄漏和指针错误。
2.2、可靠的日志记录和查看机制,帮助开发者调试和监控应用程序。3、硬件功能:访问摄像头、
3、优点
3、优点
1、性能优化:可以使用高效的本地代码,尤其是在性能关键的部分。JNI允许Java代码调用本地代码的函数,也允许本地代码调用Java代码的函数。性能优化:在需要大量计算或复杂逻辑的地方使用本地代码。
JNI(Java Native Interface)是Java平台的重要组成部分,允许Java代码与本地(通常是C/C++)代码进行互操作。使用场景、
欢迎点赞|关注|收藏|评论,您的肯定是我创作的动力 |