一个Native Service的完整示例
来源:互联网 发布:约瑟夫环算法python 编辑:程序博客网 时间:2024/05/18 22:12
参考:http://blog.csdn.net/ljsbuct/article/details/7108578
http://blog.csdn.net/blackboyofsnp/article/details/7243070
在android源代码下新建一个nativeservice的目录,在下面分别创建'add','application','jni','service'几个目录。
1.service下有AddService.h、AddService.cpp、addserver.cpp、Android.mk几个文件
AddService.h:
点击(此处)折叠或打开AddService.cpp
addserver.cpp
Android.mk
在service目录下执行mm,可以生成可执行文件addservice。
2.Add目录下有‘Add.cpp’,‘Add.h’,'Android.mk'几个文件
Add.h
Add.cpp
Android.mk
在service目录下执行mm,可以生成库文件libAdd.so
3.jni目录下有‘com_hello_Service_MySer.h’,‘com_hello_Service_MySer.cpp’,'Android.mk'几个文件
com_hello_Service_MySer.h
com_hello_Service_MySer.cpp
Android.mk
在service目录下执行mm,可以生成库文件libJniAdd.so
4.application目录下是一个app工程
MySer.java:
可以生成Service.apk。
5.Service.apk 安装到手机
addservice push到/system/bin
libAdd.so和libJniAdd.so push到/system/lib
6.修改init.rc,在下面新增:
这样就新增了一个服务,通过ps ,service list 或getprop都可以查看该服务
6.运行app
http://blog.csdn.net/blackboyofsnp/article/details/7243070
在android源代码下新建一个nativeservice的目录,在下面分别创建'add','application','jni','service'几个目录。
1.service下有AddService.h、AddService.cpp、addserver.cpp、Android.mk几个文件
AddService.h:
点击(此处)折叠或打开
- #ifndef ANDROID_ADDSERVICE_H
- #define ANDROID_ADDSERVICE_H
- #include <utils/RefBase.h>
- #include <binder/IInterface.h>
- #include <binder/Parcel.h>
- namespace android
- {
- class AddService : public BBinder
- {
- private:
- mutable Mutex m_Lock;
- int32_t m_NextConnId;
- public:
- static int Instance();
- AddService();
- virtual ~AddService();
- virtual status_t onTransact(uint32_t, const Parcel&, Parcel*, uint32_t);
- };
- }
- #endif
点击(此处)折叠或打开
- #include <binder/IServiceManager.h>
- #include <binder/IPCThreadState.h>
- #include "AddService.h"
- namespace android
- {
- static struct sigaction oldact;
- static pthread_key_t sigbuskey;
-
- int AddService::Instance()
- {
- LOGE("ZPService Instantiate\n");
- int ret = defaultServiceManager()->addService(
- String16("zp.svc"), new AddService());
- LOGE("AddService ret = %d\n", ret);
- return ret;
- }
- AddService::AddService()
- {
- LOGV("AddService create\n");
- //m_NextConnId = 1;
- pthread_key_create(&sigbuskey,NULL);
- }
- AddService::~AddService()
- {
- pthread_key_delete(sigbuskey);
- LOGV("AddService destory\n");
- }
- status_t AddService::onTransact(uint32_t code,
- const Parcel& data,
- Parcel* reply,
- uint32_t flags)
- {
- switch(code)
- {
- case 0:
- {
- pid_t pid = data.readInt32();
- int num = data.readInt32();
- num += 1000;
- reply->writeInt32(num);
- return NO_ERROR;
- } break;
- default:
- return BBinder::onTransact(code, data, reply, flags);
- }
- }
- }
点击(此处)折叠或打开
- #include <stdio.h>
- #include <sys/types.h>
- #include <unistd.h>
- #include <grp.h>
- #include <binder/IPCThreadState.h>
- #include <binder/ProcessState.h>
- #include <binder/IServiceManager.h>
- #include <utils/Log.h>
- #include "AddService.h"
- using namespace android;
- int main(int arg, char** argv)
- {
- printf("server - ain() begin\n");
- sp<ProcessState> proc(ProcessState::self());
- sp<IServiceManager> sm = defaultServiceManager();
- //LOGI("ServiceManager: %p\n", sm.get());
- printf("server - erviceManager: %p\n", sm.get());
- int ret = AddService::Instance();
- printf("server - ZPService::Instance return %d\n", ret);
- ProcessState::self()->startThreadPool();
- IPCThreadState::self()->joinThreadPool();
- return 0;
- }
点击(此处)折叠或打开
- LOCAL_PATH:=$(call my-dir)
- include $(CLEAR_VARS)
- LOCAL_SRC_FILES:=AddService.cpp addserver.cpp
- LOCAL_SHARED_LIBRARIES:=libutils libbinder
- LOCAL_MODULE_TAGS:=optional
- LOCAL_MODULE:=addservice
- LOCAL_PRELINK_MODULE:=false
- #include $(BUILD_SHARED_LIBRARY)
- include $(BUILD_EXECUTABLE)
2.Add目录下有‘Add.cpp’,‘Add.h’,'Android.mk'几个文件
Add.h
点击(此处)折叠或打开
- #ifndef _Included_Add
- #define _Included_Add
- namespace android
- {
- class Add
- {
- public:
- int setN(int n);
- private:
- static void getAddService();
- };
- }
- #endif
点击(此处)折叠或打开
- #include <binder/IServiceManager.h>
- #include <binder/IPCThreadState.h>
- #include <Add.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <jni.h>
- namespace android
- {
- sp<IBinder> binder;
-
- int Add::setN(int n)
- {
- getAddService();
- Parcel data, reply;
- data.writeInt32(getpid());
- data.writeInt32(n);
-
- LOGE("client - binder->transact()\n");
- binder->transact(0, data, &reply);
- int r = reply.readInt32();
- return r;
- }
- void Add::getAddService()
- {
- sp<IServiceManager> sm = defaultServiceManager();
- binder = sm->getService(String16("zp.svc"));
- LOGE("client - etService: %p\n", sm.get());
- if(binder == 0)
- {
- LOGW("ZPService not published, waiting...");
- return;
- }
- }
- };
点击(此处)折叠或打开
- LOCAL_PATH:=$(call my-dir)
- include $(CLEAR_VARS)
- LOCAL_SRC_FILES:=Add.cpp
- LOCAL_SHARED_LIBRARIES:=libutils libbinder
- LOCAL_MODULE_TAGS:=optional
- LOCAL_MODULE:=libAdd
- LOCAL_PRELINK_MODULE:=false
- include $(BUILD_SHARED_LIBRARY)
3.jni目录下有‘com_hello_Service_MySer.h’,‘com_hello_Service_MySer.cpp’,'Android.mk'几个文件
com_hello_Service_MySer.h
点击(此处)折叠或打开
- /* DO NOT EDIT THIS FILE - it is machine generated */
- #include <jni.h>
- /* Header for class com_hello_Service_MySer */
- #ifndef _Included_com_hello_Service_MySer
- #define _Included_com_hello_Service_MySer
- #ifdef __cplusplus
- extern "C" {
- #endif
- /*
- * Class: com_hello_Service_MySer
- * Method: intFromJNI
- * Signature: ()I
- */
- JNIEXPORT jint JNICALL Java_com_hello_Service_MySer_intFromJNI
- (JNIEnv *, jobject);
- #ifdef __cplusplus
- }
- #endif
- #endif
点击(此处)折叠或打开
- #include <jni.h>
- #include <JNIHelp.h>
- #include "../add/Add.h"
- #include "com_hello_Service_MySer.h"
- using namespace android;
- JNIEXPORT jint JNICALL Java_com_hello_Service_MySer_intFromJNI(JNIEnv * env, jobject)
- {
- Add* p = new Add();
- int r = p->setN(5);
- return r;
- }
点击(此处)折叠或打开
- LOCAL_PATH:=$(call my-dir)
- include $(CLEAR_VARS)
- LOCAL_SRC_FILES:=com_hello_Service_MySer.cpp
- LOCAL_SHARED_LIBRARIES:=libutils libAdd
- LOCAL_MODULE_TAGS:=optional
- LOCAL_C_INCLUDES:= $(JNI_H_INCLUDE)
- LOCAL_MODULE:=libJniAdd
- LOCAL_PRELINK_MODULE:=false
- include $(BUILD_SHARED_LIBRARY)
4.application目录下是一个app工程
MySer.java:
点击(此处)折叠或打开
- package com.hello.Service;
- import android.os.Bundle;
- import android.app.Activity;
- import android.view.Menu;
- import android.widget.TextView;
- public class MySer extends Activity {
- private TextView tv;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_my_ser);
- int i = intFromJNI();
- tv = (TextView)findViewById(R.id.tv);
- tv.setText( String.valueOf(i) );
- }
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- // Inflate the menu; this adds items to the action bar if it is present.
- getMenuInflater().inflate(R.menu.my, menu);
- return true;
- }
- public native int intFromJNI();
- static {
- System.loadLibrary("JniAdd");
- }
- }
5.Service.apk 安装到手机
addservice push到/system/bin
libAdd.so和libJniAdd.so push到/system/lib
6.修改init.rc,在下面新增:
点击(此处)折叠或打开
- service addservice /system/bin/addservice
- class main
- user root
6.运行app
阅读全文
0 0
- 一个Native Service的完整示例
- 一个Native Service的完整示例
- Native Service的完整示例
- 【Android Native Code开发系列】六 一个Native Service的完整示例
- 【Android Native Code开发系列】六 一个Native Service的完整示例
- 【Android Native Code开发系列】一个Native Service的完整示例 1234567
- 【Android Native Code开发系列】六 一个Native Service的完整示例
- Android 6.0一个完整的native service
- 一个完整的android Service
- 如何写一个native层的service
- 怎么写一个native层的service
- 一个完整的Oracle触发器示例
- 一个完整的php项目示例
- 一个动态游标的完整示例
- 一个完整的示例包体
- React Router的一个完整示例
- 一个java类的完整示例:
- 一个完整的jQuery datatable示例
- 使用JavaScript判断手机是处于横屏还是竖屏
- 线程
- 创新实训6.8 改了很多bug(各个方面都有
- android 6.0动态弹框申请权限实现
- R语言利用ROCR评测模型的预测能力
- 一个Native Service的完整示例
- 廖师兄springboot学习笔记二(增加IDEA单模块jsp和多模块jsp引入)
- Windows 7 64位安装TenSorFlow详细步骤
- URL资源请求
- 总结共享
- 获得省市区的统计信息
- OpenGL ES着色器语言之变量和数据类型
- 双输入感知器(Perceptron)的决策空间
- c/c++字符串处理-split/trim/find/rfind/substr/strstr