日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android framwork service添加(manager 远程调service,service jni调native code)

發布時間:2025/3/15 Android 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android framwork service添加(manager 远程调service,service jni调native code) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在平常android應用開發中,多數只是調framwork中的API進行application layer的coding,而在系統開發中可能會自己添加系統服務;
系統服務如任何添加,服務如何調native code,以及service如何被manager調用...這里我給出一個結果驗證的demo。

1、實現編寫native code,framwork/base/services/jni/com_android_server_VirtualInputService.cpp;

? ?以下是會使用到的native 函數,以及register_android_server_VirtualInputService;具體實現就不在詳講了。

[java]?view plaincopy print?
  • static?JNINativeMethod?method_table[]?=?{??
  • ????{"native_open",?????????????"()I",(void?*)android_server_VirtualInputService_open},??
  • ????{"native_close",????????????"()Z",??(void?*)android_server_VirtualInputService_close},??
  • ????{"native_sendir",???????"(II)Z",??(void?*)android_server_VirtualInputService_sendir},??
  • };??
  • ?????
  • +int?register_android_server_VirtualInputService(JNIEnv?*env)??
  • +{??
  • +????jclass?clazz?=?env->FindClass("com/android/server/VirtualInputService");??
  • +????if?(clazz?==?NULL)?{??
  • +????????ALOGE("Can't?find?com/android/server/VirtualInputService");??
  • +????????return?-1;??
  • +????}??
  • +?????
  • +????return?jniRegisterNativeMethods(env,?"com/android/server/VirtualInputService",??
  • +????????????method_table,?NELEM(method_table));??
  • +}??
  • +};??

  • 2、base/services/jni/onload.cpp中添加register_android_server_VirtualInputService

    [java]?view plaincopy print?
  • ?int?register_android_server_SerialService(JNIEnv*?env);??
  • +int?register_android_server_VirtualInputService(JNIEnv*?env);??
  • ?int?register_android_server_UsbDeviceManager(JNIEnv*?env);??
  • ???
  • ??????register_android_server_SerialService(env);??
  • +???register_android_server_VirtualInputService(env);??
  • ?????register_android_server_InputApplicationHandle(env);??

  • 3、mk中添加com_android_server_VirtualInputService,使其被編譯到

    [java]?view plaincopy print?
  • +++?base/services/jni/Android.mk????(working?copy)??
  • @@?-16,6?+16,7?@@??
  • ?????com_android_server_VibratorService.cpp?\??
  • ?????com_android_server_location_GpsLocationProvider.cpp?\??
  • ?????com_android_server_connectivity_Vpn.cpp?\??
  • +????com_android_server_VirtualInputService.cpp?\??
  • ?????onload.cpp??

  • 4、service添加: base/services/java/com/android/server/VirtualInputService.java ??
    ? ?其必須繼承IVirtualInputManager.Stub使其能被遠程調用;
    ? ?聲明native方法:private native static int native_open();
    ?private native static boolean native_close();
    private native static boolean native_sendir(int keycode, int type);

    [java]?view plaincopy print?
  • +package?com.android.server;??
  • +??
  • +import?android.content.Context;??
  • +import?android.hardware.input.IVirtualInputManager;??
  • +import?android.util.Log;??
  • +??
  • +import?java.io.File;??
  • +import?java.util.ArrayList;??
  • +??
  • +public?class?VirtualInputService?extends?IVirtualInputManager.Stub?{??
  • +????private?static?final?String?TAG?=?"VirtualInputManager";??
  • +??
  • +????private?final?Context?mContext;??
  • +????private?int?mVirtualInputFd?=?-1;??
  • +??
  • +????public?VirtualInputService(Context?context)?{??
  • +????????mContext?=?context;??
  • +???????if(mVirtualInputFd?==?-1){??
  • +???????????mVirtualInputFd?=?native_open();??
  • +???????????Log.d(TAG,?"mVirtualInputFd:"+mVirtualInputFd);??
  • +???????}else??
  • +???????????Log.d(TAG,?"mVirtualInputFd1:"+mVirtualInputFd);??
  • +??
  • +????}??
  • +??
  • +???public?boolean?SendIR(int?keycode){??
  • +???????if(mVirtualInputFd?>?0)??
  • +???????{?????
  • +???????????Log.d(TAG,?"Service?SendIR:"+keycode);??
  • +???????????return?native_sendir(keycode,0);??
  • +???????}??
  • +???????else???
  • +???????????return?false;??
  • +???}??
  • +?????
  • +????private?native?static?int?native_open();??
  • +???private?native?static?boolean?native_close();??
  • +???private?native?static?boolean?native_sendir(int?keycode,?int?type);??
  • +??
  • +}????

  • 5、base/services/java/com/android/server/SystemServer.java中添加新service


    [java]?view plaincopy print?
  • SerialService?serial?=?null;??
  • VirtualInputService?VirtualInput?=?null;??
  • ?TwilightService?twilight?=?null;??

  • [java]?view plaincopy print?
  • ?????????????try?{??
  • +????????????????Slog.i(TAG,?"VirtualInput?Service");??
  • +????????????????VirtualInput?=?new?VirtualInputService(context);??
  • +????????????????ServiceManager.addService(Context.VIRTUALINPUT_SERVICE,?VirtualInput);??
  • +????????????}?catch?(Throwable?e)?{??
  • +????????????????Slog.e(TAG,?"Failure?starting?VirtualInputService",?e);??
  • +????????????}??
  • +?????????????
  • +????????????try?{??
  • ?????????????????Slog.i(TAG,?"Twilight?Service");??
  • ?????????????????twilight?=?new?TwilightService(context);??
  • ?????????????}?catch?(Throwable?e)?{??

  • 6、添加aidl接口:base/core/java/android/hardware/input/IVirtualInputManager.aidl

    [java]?view plaincopy print?
  • +package?android.hardware.input;??
  • +??
  • +??
  • +/**?@hide?*/??
  • +interface?IVirtualInputManager??
  • +{??
  • +???boolean?SendIR(int?keycode);??
  • +}??

  • 7、實現IVirtualInputManager.java;base/core/java/android/hardware/input/VirtualInputManager.java

    [java]?view plaincopy print?
  • +package?android.hardware.input;??
  • +??
  • +import?android.app.PendingIntent;??
  • +import?android.content.Context;??
  • +import?android.os.Bundle;??
  • +import?android.os.ParcelFileDescriptor;??
  • +import?android.os.RemoteException;??
  • +import?android.os.SystemProperties;??
  • +import?android.util.Log;??
  • +??
  • +import?java.io.IOException;??
  • +import?java.util.HashMap;??
  • +??
  • +/**?
  • +?*?@hide?
  • +?*/??
  • +public?class?VirtualInputManager?{??
  • +????private?static?final?String?TAG?=?"VirtualInputManager";??
  • +??
  • +????private?final?Context?mContext;??
  • +????private?final?IVirtualInputManager?mService;??
  • +??
  • +????/**?
  • +?????*?{@hide}?
  • +?????*/??
  • +????public?VirtualInputManager(Context?context,?IVirtualInputManager?service)?{??
  • +????????mContext?=?context;??
  • +????????mService?=?service;??
  • +???????Log.d(TAG,"VirtualInputManager");??
  • +????}??
  • +??
  • +???public?boolean?SendIR(int?keycode)?throws?android.os.RemoteException{??
  • +???????Log.d(TAG,"keycode:"+keycode);??
  • +???????return?mService.SendIR(keycode);??
  • +???}??
  • +}??

  • 8.framwork/base/Android.mk

    [java]?view plaincopy print?
  • core/java/android/hardware/input/IInputManager.aidl?\??
  • core/java/android/hardware/input/IVirtualInputManager.aidl?\??
  • core/java/android/hardware/input/IInputDevicesChangedListener.aidl?\??

  • 9、base/core/java/android/content/Context.java ?中添加系統獲取服務的標示?

    [java]?view plaincopy print?
  • +????public?static?final?String?VIRTUALINPUT_SERVICE?=?"virtualinput";??

  • 10、base/core/java/android/app/ContextImpl.java

    [java]?view plaincopy print?
  • +????????registerService(VIRTUALINPUT_SERVICE,?new?ServiceFetcher()?{??
  • +????????????????public?Object?createService(ContextImpl?ctx)?{??
  • +????????????????????IBinder?b?=?ServiceManager.getService(VIRTUALINPUT_SERVICE);??
  • +????????????????????return?new?VirtualInputManager(ctx,?IVirtualInputManager.Stub.asInterface(b));??
  • +????????????????}});??
  • +?????????????????

  • ? ?以上就是添加一個完整的service的步驟了...


    原文地址:http://blog.csdn.net/cuityanxi/article/details/18082303

    總結

    以上是生活随笔為你收集整理的Android framwork service添加(manager 远程调service,service jni调native code)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。