一个Native Service的完整示例

参考:http://blog.youkuaiyun.com/ljsbuct/article/details/7108578
          http://blog.youkuaiyun.com/blackboyofsnp/article/details/7243070
在android源代码下新建一个nativeservice的目录,在下面分别创建'add','application','jni','service'几个目录。
1.service下有AddService.h、AddService.cpp、addserver.cpp、Android.mk几个文件
  AddService.h:
   
点击(此处)折叠或打开

  1. #ifndef ANDROID_ADDSERVICE_H
  2. #define ANDROID_ADDSERVICE_H
  3.  
  4. #include <utils/RefBase.h>
  5. #include <binder/IInterface.h>
  6. #include <binder/Parcel.h>
  7.  
  8. namespace android
  9. {
  10.     class AddService : public BBinder
  11.     {
  12.     private:
  13.         mutable Mutex m_Lock;
  14.         int32_t m_NextConnId;
  15.  
  16.     public:
  17.         static int Instance();
  18.         AddService();
  19.         virtual ~AddService();
  20.         virtual status_t onTransact(uint32_t, const Parcel&, Parcel*, uint32_t);
  21.     };
  22. }
  23.  
  24. #endif

AddService.cpp
 

点击(此处)折叠或打开

  1. #include <binder/IServiceManager.h>
  2. #include <binder/IPCThreadState.h>
  3. #include "AddService.h"
  4.  
  5. namespace android
  6. {
  7.     static struct sigaction oldact;
  8.     static pthread_key_t sigbuskey;
  9.     
  10.     int AddService::Instance()
  11.     {
  12.         LOGE("ZPService Instantiate\n");
  13.         int ret = defaultServiceManager()->addService(
  14.                 String16("zp.svc"), new AddService());
  15.         LOGE("AddService ret = %d\n", ret);
  16.         return ret;
  17.     }
  18.  
  19.     AddService::AddService()
  20.     {
  21.         LOGV("AddService create\n");
  22.         //m_NextConnId = 1;
  23.         pthread_key_create(&sigbuskey,NULL);
  24.     }
  25.  
  26.     AddService::~AddService()
  27.     {
  28.         pthread_key_delete(sigbuskey);
  29.         LOGV("AddService destory\n");
  30.     }
  31.  
  32.     status_t AddService::onTransact(uint32_t code, 
  33.                                  const Parcel& data, 
  34.                                  Parcel* reply,
  35.                                  uint32_t flags)
  36.     {
  37.         switch(code)
  38.         {
  39.         case 0: 
  40.             {
  41.                 pid_t pid = data.readInt32();
  42.                 int num = data.readInt32();
  43.                 num += 1000;
  44.                 reply->writeInt32(num);
  45.                 return NO_ERROR;
  46.             } break;
  47.         default:
  48.             return BBinder::onTransact(code, data, reply, flags);
  49.         }
  50.     }
  51. }

addserver.cpp
 

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <sys/types.h>
  3. #include <unistd.h>
  4. #include <grp.h>
  5. #include <binder/IPCThreadState.h>
  6. #include <binder/ProcessState.h>
  7. #include <binder/IServiceManager.h>
  8. #include <utils/Log.h>
  9. #include "AddService.h"
  10.  
  11. using namespace android;
  12.  
  13.  
  14. int main(int arg, char** argv)
  15. {
  16.     printf("server - ain() begin\n");
  17.     sp<ProcessState> proc(ProcessState::self());
  18.     sp<IServiceManager> sm = defaultServiceManager();
  19.     //LOGI("ServiceManager: %p\n", sm.get());
  20.     printf("server - erviceManager: %p\n", sm.get());
  21.     int ret = AddService::Instance();
  22.     printf("server - ZPService::Instance return %d\n", ret);
  23.     ProcessState::self()->startThreadPool();
  24.  
  25.         IPCThreadState::self()->joinThreadPool(); 
  26.         return 0; 
  27. }

Android.mk
 

点击(此处)折叠或打开

  1. LOCAL_PATH:=$(call my-dir)
  2. include $(CLEAR_VARS)
  3. LOCAL_SRC_FILES:=AddService.cpp addserver.cpp
  4. LOCAL_SHARED_LIBRARIES:=libutils libbinder
  5. LOCAL_MODULE_TAGS:=optional
  6. LOCAL_MODULE:=addservice
  7. LOCAL_PRELINK_MODULE:=false
  8. #include $(BUILD_SHARED_LIBRARY)
  9. include $(BUILD_EXECUTABLE)

  在service目录下执行mm,可以生成可执行文件addservice。

2.Add目录下有‘Add.cpp’,‘Add.h’,'Android.mk'几个文件
 Add.h

点击(此处)折叠或打开

  1. #ifndef _Included_Add
  2. #define _Included_Add
  3.  
  4. namespace android
  5. {
  6.     class Add
  7.     {
  8.     public:
  9.         int setN(int n);
  10.     private:
  11.         static void getAddService();
  12.     };
  13. }
  14. #endif

 

 

Add.cpp

 

 

点击(此处)折叠或打开

  1. #include <binder/IServiceManager.h>
  2. #include <binder/IPCThreadState.h>
  3. #include <Add.h>
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <jni.h>
  7. namespace android
  8. {
  9.     sp<IBinder> binder;
  10.     
  11.     int Add::setN(int n)
  12.     {
  13.         getAddService();
  14.         Parcel data, reply;
  15.         data.writeInt32(getpid());
  16.         data.writeInt32(n);
  17.         
  18.         LOGE("client - binder->transact()\n");
  19.         binder->transact(0, data, &reply);
  20.         int r = reply.readInt32();
  21.         return r;
  22.     }
  23.  
  24.     void Add::getAddService()
  25.     {
  26.         sp<IServiceManager> sm = defaultServiceManager();
  27.         binder = sm->getService(String16("zp.svc"));
  28.         LOGE("client - etService: %p\n", sm.get());
  29.         if(binder == 0)
  30.         {
  31.             LOGW("ZPService not published, waiting...");
  32.             return;
  33.         }
  34.     }
  35.  
  36. };

Android.mk

点击(此处)折叠或打开

  1. LOCAL_PATH:=$(call my-dir)
  2. include $(CLEAR_VARS)
  3. LOCAL_SRC_FILES:=Add.cpp
  4. LOCAL_SHARED_LIBRARIES:=libutils libbinder
  5. LOCAL_MODULE_TAGS:=optional
  6. LOCAL_MODULE:=libAdd
  7. LOCAL_PRELINK_MODULE:=false
  8. include $(BUILD_SHARED_LIBRARY)

 

  在service目录下执行mm,可以生成库文件libAdd.so
3.jni目录下有‘com_hello_Service_MySer.h’,‘com_hello_Service_MySer.cpp’,'Android.mk'几个文件
com_hello_Service_MySer.h

 

点击(此处)折叠或打开

  1. /* DO NOT EDIT THIS FILE - it is machine generated */ 
  2. #include <jni.h> 
  3. /* Header for class com_hello_Service_MySer */ 
  4. #ifndef _Included_com_hello_Service_MySer 
  5. #define _Included_com_hello_Service_MySer 
  6. #ifdef __cplusplus 
  7. extern "C" { 
  8. #endif 
  9. /* 
  10.   * Class: com_hello_Service_MySer 
  11.   * Method: intFromJNI 
  12.   * Signature: ()
  13.   */ 
  14. JNIEXPORT jint JNICALL Java_com_hello_Service_MySer_intFromJNI 
  15.   (JNIEnv *, jobject); 
  16. #ifdef __cplusplus 
  17. } 
  18. #endif
  19. #endif

com_hello_Service_MySer.cpp
 

点击(此处)折叠或打开

  1. #include <jni.h> 
  2. #include <JNIHelp.h> 
  3. #include "../add/Add.h" 
  4. #include "com_hello_Service_MySer.h" 
  5.  
  6. using namespace android;
  7. JNIEXPORT jint JNICALL Java_com_hello_Service_MySer_intFromJNI(JNIEnv * env, jobject) 
  8. { 
  9.     Add* p = new Add();
  10.     int r = p->setN(5);
  11.     return r; 
  12. }

Android.mk
 

点击(此处)折叠或打开

  1. LOCAL_PATH:=$(call my-dir)
  2. include $(CLEAR_VARS)
  3. LOCAL_SRC_FILES:=com_hello_Service_MySer.cpp
  4. LOCAL_SHARED_LIBRARIES:=libutils libAdd
  5. LOCAL_MODULE_TAGS:=optional
  6. LOCAL_C_INCLUDES:= $(JNI_H_INCLUDE)
  7. LOCAL_MODULE:=libJniAdd
  8. LOCAL_PRELINK_MODULE:=false
  9. include $(BUILD_SHARED_LIBRARY)

  在service目录下执行mm,可以生成库文件libJniAdd.so
4.application目录下是一个app工程
MySer.java:

 

点击(此处)折叠或打开

  1. package com.hello.Service;
  2.  
  3.  
  4. import android.os.Bundle;
  5. import android.app.Activity;
  6. import android.view.Menu;
  7. import android.widget.TextView;
  8.  
  9. public class MySer extends Activity {
  10.  
  11.     private TextView tv;
  12.     @Override
  13.     protected void onCreate(Bundle savedInstanceState) {
  14.         super.onCreate(savedInstanceState);
  15.         setContentView(R.layout.activity_my_ser);
  16.         int i = intFromJNI(); 
  17.         tv = (TextView)findViewById(R.id.tv); 
  18.         tv.setText( String.valueOf(i) ); 
  19.     }
  20.     @Override
  21.     public boolean onCreateOptionsMenu(Menu menu) {
  22.         // Inflate the menu; this adds items to the action bar if it is present.
  23.         getMenuInflater().inflate(R.menu.my, menu);
  24.         return true;
  25.     }
  26.      public native int intFromJNI(); 
  27.      static { 
  28.      System.loadLibrary("JniAdd"); 
  29.      } 
  30.  
  31. }

可以生成Service.apk。
5.Service.apk 安装到手机
   addservice push到/system/bin
   libAdd.solibJniAdd.so push到/system/lib
6.修改init.rc,在下面新增:
  

 

点击(此处)折叠或打开

  1. service addservice /system/bin/addservice
  2. class main
  3. user root

这样就新增了一个服务,通过ps ,service list 或getprop都可以查看该服务
6.运行app

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值