本文继上一篇文章继续写代码Android 从上到下写一个例子 SELinux权限(一)_we1less的博客-CSDN博客
此时需要一个本地服务首先将jni文件写好 包括调用hal层代码
路径frameworks/base/services/core/jni/com_android_server_GodvService.cpp
#define LOG_TAG "godv"
#include "jni.h"
#include <nativehelper/JNIHelp.h>
#include "android_runtime/AndroidRuntime.h"
#include <utils/misc.h>
#include <utils/Log.h>
//hw_module_t的头文件
#include <hardware/hardware.h>
#include <stdio.h>
namespace android
{
//实际硬件的结构体 继承自hw_device_t
struct led_device_t
{
hw_device_t commn;
int (*hal_open)();
int (*hal_ioctl)(int which,int status);
int (*hal_close)();
};
struct led_device_t *led;
//没用到的形参可以省略
static jint godv_open(JNIEnv*, jobject) {
ALOGE("native::godv_open");
struct hw_module_t *module;
struct hw_device_t *device;
int res;
//参数1模块id 参数2要获取的模块的结构体
res = hw_get_module("godvled", (const struct hw_module_t **)&module);
if(res == 0) {
ALOGE("native::hw_get_module success");
//参数1module 参数2模块id 参数3硬件设备的结构体
res = module->methods->open(module, "godvled", &device);
if(res == 0) {
ALOGE("native::open success");
led = (struct led_device_t *)device;
//调用hal层的方法
led->hal_open();
}
}
return 0;
}
static jint godv_ioctl(JNIEnv*, jobject, jint which, jint status) {
ALOGE("native::godv_ioctl which == %d , status == %d ", which, status);
led->hal_ioctl(which, status);
return 0;
}
static const JNINativeMethod method_table[] = {
{ "godv_open", "()I", (void*)godv_open },
{ "godv_ioctl", "(II)I", (void*)godv_ioctl }
};
int register_android_server_GodvService(JNIEnv *env)
{
return jniRegisterNativeMethods(env, "com/android/server/GodvService",
method_table, NELEM(method_table));
}
};
接下来在frameworks/base/services/core/jni/onload.cpp文件中将本地服务注册
extern "C" jint JNI_OnLoad(JavaVM* vm, void* /* reserved */)
{
JNIEnv* env = NULL;
jint result = -1;
if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) {
ALOGE("GetEnv failed!");
return result;
}
ALOG_ASSERT(env, "Could not retrieve the env!");
...
register_android_server_GodvService(env);
register_android_hardware_display_DisplayViewport(env);
return JNI_VERSION_1_4;
}
修改当前路径的mk文件 frameworks/base/services/core/jni
LOCAL_SRC_FILES += \
...
$(LOCAL_REL_DIR)/com_android_server_GodvService.cpp \
$(LOCAL_REL_DIR)/onload.cpp
编译 make -j16 ANDROID_COMPILE_WITH_JACK=false
编译成功后运行app得到log证明本地服务已经成功
godv@godv-OptiPlex-7070:~/godv/AOSP/android-8.1.0_r1$ adb logcat -s "godv"
--------- beginning of main
--------- beginning of system
--------- beginning of crash
09-09 23:18:32.692 1542 1542 D godv : GodvService::godv_open
09-09 23:18:32.692 1542 1542 E godv : native::godv_open
09-09 23:18:32.693 1542 1542 E godv : native::hw_get_module success
09-09 23:18:32.693 1542 1542 E godv : native::open success
09-09 23:18:32.693 1542 1542 I godv : this is led_hal_open
09-09 23:18:47.074 1542 2000 D godv : GodvService::gov_ioctl
09-09 23:18:47.074 1542 2000 E godv : native::godv_ioctl which == 0 , status == 1
09-09 23:18:47.074 1542 2000 I godv : this is led_hal_ioctl
09-09 23:18:47.074 1542 2000 I godv : which = 0, status = 1
看一下编译在system/lib/hw目录下的so
generic_x86_64:/system/lib/hw # ls
android.hardware.tests.libhwbinder@1.0-impl.so godvled.default.so