RK 方案如何添加一个JNI 接口

news2024/9/30 5:34:06

(1)添加文件 frameworks/base/services/core/jni/com_android_server_switch_SwitchusbAction.cpp com_android_server_switch_SwitchusbAction.cpp

/*
 * Copyright (C) 2009 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#define LOG_TAG "LightsService"

#include "jni.h"
#include <nativehelper/JNIHelp.h>
//#include "android_runtime/AndroidRuntime.h"

#include <utils/misc.h>
#include <utils/Log.h>
#include <hardware/hardware.h>
#include <hardware/lights.h>
#include <fcntl.h>
#include <stdio.h>
#include <sys/ioctl.h>


#define SWITCH_USB_MAGIC 'k'  //当然我们也可以定义一个相应的头文件,把ioctl的cmd放进里面,然后再include进 来
#define SWITCH_USB_OFF    _IO(SWITCH_USB_MAGIC,0x1A)    // OFF
#define SWITCH_USB_ON     _IO(SWITCH_USB_MAGIC,0x1B)    // ON


int switchusb_fd=-1;


namespace android
{



static jint SwitchUsbOpen_native(JNIEnv* /* env */, jobject /* clazz */)
{


       // int cmd=0;
        //int arg =0;
        switchusb_fd=open("/dev/switchusb",O_RDWR);
        if(switchusb_fd==-1)
        {
            printf("open switchusb fail\r\n");
            return -1;
        }
/*
       if(ioctl(fd,OPEN,&arg)<0)
        {
          printf("ioctl action fail");
           return -3;

        }
*/

        return 0;

}



static jint SwitchUsbWrite_native(JNIEnv* /* env */, jobject /* clazz */,jint value)
{
    return 0;
}

static jint SwitchUsbIoctl_native(JNIEnv* /* env */, jobject /* clazz */,jint cmd ,jint value)
{
    printf("ddy ioctl action 进来了么");
        int arg =value;

       if(cmd==0)
       {
            if(ioctl(switchusb_fd,SWITCH_USB_OFF,&arg)<0)
            {
                printf("ioctl action fail");
                return -3;

            }
       }
       else
       {
            if(ioctl(switchusb_fd,SWITCH_USB_ON,&arg)<0)
            {
                printf("ioctl action fail");
                return -3;

            }
       }
   return 0;
    
}



static const JNINativeMethod method_table[] = {
    { "nativeSwitchUsbActionOpen", "()I", (void*)SwitchUsbOpen_native },
    { "nativeSwitchUsbActionWrite", "(I)I", (void*)SwitchUsbWrite_native },
    { "nativeSwitchUsbActionIoctl", "(II)I", (void*)SwitchUsbIoctl_native },
};




int register_android_server_SwitchUsb(JNIEnv *env)
{
    return jniRegisterNativeMethods(env, "com/android/server/SwitchUsbAction",
            method_table, NELEM(method_table));
}

};

(2)修改onload.cpp

----------------- frameworks/base/services/core/jni/onload.cpp -----------------
index 5d6ab96704..3db96d7c5b 100755
@@ -72,6 +72,8 @@ int register_android_server_RtcAlarmPowerOn(JNIEnv* env);
 int register_android_server_VendorStorage(JNIEnv* env);
 int register_android_server_utils_HdpkeyLoader(JNIEnv* env);
 int register_android_server_utils_HdmiService(JNIEnv* env);
+int register_android_server_SwitchUsb(JNIEnv* env);
+
 };
 
 using namespace android;
@@ -137,5 +139,6 @@ extern "C" jint JNI_OnLoad(JavaVM* vm, void* /* reserved */)
     register_android_server_VendorStorage(env);
     register_android_server_utils_HdpkeyLoader(env);
     register_android_server_utils_HdmiService(env);
+    register_android_server_SwitchUsb(env);
     return JNI_VERSION_1_4;
 }


(3)修改Android.bp 文件,使添加的com_android_server_switch_SwitchusbAction.cpp编译进来

----------------- frameworks/base/services/core/jni/Android.bp -----------------
index 1fae787539..e98d6c446d 100755
@@ -66,6 +66,7 @@ cc_library_static {
         "com_android_server_VendorStorage.cpp",
         "com_android_server_utils_HdpkeyLoader.cpp",
         "com_android_server_utils_HdmiService.cpp",
+        "com_android_server_switch_SwitchusbAction.cpp",
         "onload.cpp",
         ":lib_networkStatsFactory_native",
     ],

(4)添加aidl 文件frameworks/base/core/java/android/os/ISwitchUsbAction.aidl

---------- frameworks/base/core/java/android/os/ISwitchUsbAction.aidl ----------
new file mode 100644
index 0000000000..16c6ec3d56
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2012 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.os;
+
+/**
+ * Direct interface to the UpdateLockService's functionality
+ *
+ * {@hide}
+ */
+interface ISwitchUsbAction {
+    int SwitchUsbActionOpen();
+    int SwitchUsbActionWrite(int value);
+    int SwitchUsbActionIoctl(int cmd, int value);
+}

(5)添加JAVA文件与JNI 接口链接上如下SwitchUsbAction.java

-- frameworks/base/services/core/java/com/android/server/SwitchUsbAction.java --
new file mode 100644
index 0000000000..85640c9572
@@ -0,0 +1,42 @@
+package com.android.server;
+ 
+import android.util.Slog;
+import android.os.ISwitchUsbAction;
+import android.content.Context;
+
+public class SwitchUsbAction extends ISwitchUsbAction.Stub{
+    private static final String TAG = "SwitchUsbAction";
+    
+    private final Context mContext;
+    public static final String SWITCH_USB_STATS_SERVICE = "switchusbaction";
+
+    public SwitchUsbAction(Context context) 
+    {
+        Slog.d(TAG,"SwitchUsbAction");
+        mContext = context;
+    }
+    
+    @Override
+    public int SwitchUsbActionOpen() throws android.os.RemoteException
+    {
+        return nativeSwitchUsbActionOpen();
+    }
+
+
+    @Override
+    public int SwitchUsbActionWrite(int value) throws android.os.RemoteException
+    {
+        return nativeSwitchUsbActionWrite(value);
+    }
+
+    @Override
+    public int SwitchUsbActionIoctl(int cmd, int value) throws android.os.RemoteException
+    {
+        return nativeSwitchUsbActionIoctl(cmd,value);
+    }
+
+
+    public static native int nativeSwitchUsbActionOpen();
+    public static native int nativeSwitchUsbActionWrite(int value);
+    public static native int nativeSwitchUsbActionIoctl(int cmd,int value);
+}

(6)最后修改下权限如下init.connectivity.rc文件:

----------------- device/rockchip/common/init.connectivity.rc -----------------
index 113e242d09..341686b96d 100644
@@ -30,6 +30,7 @@ on zygote-start
     chmod 0664 /dev/vendor_storage
     chmod 0664 /sys/touchscreen/glove
     chmod 0664 /sys/devices/platform/fe8a0000.usb2-phy/otg_mode
+    chmod 0664 /dev/switchusb
     chown bluetooth net_bt /dev/vflash
     chown bluetooth net_bt /dev/vendor_storage

@@ -46,6 +47,7 @@ on zygote-start
     chown system system /sys/touchscreen/glove
     chown system system /sys/devices/platform/fe8a0000.usb2-phy/otg_mode
     chown system system /sys/class/boe_dev/boe_amp_dev/amplifier_control
+    chown system system /dev/switchusb

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2178777.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PHP 基础语法详解

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

【有啥问啥】多目标跟踪SORT算法原理详解

多目标跟踪SORT算法原理详解 引言 多目标跟踪&#xff08;Multiple Object Tracking, MOT&#xff09;是计算机视觉领域的一个重要研究方向&#xff0c;广泛应用于视频监控、自动驾驶、人机交互等多个领域。其核心任务是在视频序列中持续、准确地识别和定位多个目标。SORT&am…

爬虫入门之爬虫原理以及请求响应

爬虫入门之爬虫原理以及请求响应 爬虫需要用到的库, 叫requests. 在导入requests库之前, 需要安装它, 打开cmd: 输入pip install 库名 pip install requests后面出现successful或requirement already就说明已经下载成功了!!! 下载出现的问题: 1.有报错或者是下载慢 修改镜像…

计算机的错误计算(一百零八)

摘要 回复网友来信&#xff0c;接前一节本节再谈多项式的错误计算。 例1. 计算 若在Visual Studio 2010中用C#编程计算&#xff1a; using System; using System.Collections.Generic; using System.Linq; class Program { static void Main(){ long part1 946495 * (…

Redis缓存双写一致性笔记(下)

Redis和Canal结合使用是一种常见的解决方案&#xff0c;用于确保MySQL数据库中的更改实时同步到Redis缓存中&#xff0c;从而保持数据的一致性。 这种同步机制虽然能够实现近乎实时的数据同步&#xff0c;但可能会有轻微的延迟&#xff0c;因此它更适合对数据一致性要求不是特…

STM32 DMA+AD多通道

单片机学习&#xff01; 目录 一、DMA配置步骤 二、ADC配置步骤 三、DMAAD多通道框图 四、DMAAD多通道函数设计详细步骤 4.1 开启RCC时钟 4.2 配置GPIO 4.3 配置多路开关 4.4 结构体初始化ADC 4.5 DMA参数初始化配置 4.5.1 外设站点的三个参数 4.5.2 存储器站点的三个…

Tomcat 调优技巧(Tomcat Tuning Tips)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…

IDEA关联Tomcat

一、Tomcat服务器 web服务器,就是运行web项目的容器 即运行java代码的一个容器 webapp(web应用程序) --> 就是我们写的javaweb项目 Tomcat 是Apache 软件基金会&#xff08;Apache Software Foundation&#xff09;下的一个核心项目&#xff0c;免费开源、并支持Servlet 和J…

yolov8/9/10模型在垃圾分类检测中的应用【代码+数据集+python环境+GUI系统】

yolov8/9/10模型在垃圾分类检测中的应用【代码数据集python环境GUI系统】 yolov8/9/10模型在垃圾分类检测中的应用【代码数据集python环境GUI系统】 背景意义 随着计算机视觉技术和深度学习算法的快速发展&#xff0c;图像识别、对象检测、图像分割等技术在各个领域得到了广泛…

DL_语义分割(学习笔记)

文章目录 图像分割1 常见分类1.1 语义分割1.2 实例分割1.3 全景分割 2 语义分割2.1 模型评价指标2.2 常用数据集2.3 转置卷积2.4 膨胀卷积2.5 感受野2.6 双线性插值2.7 FCN 图像分割 1 常见分类 1.1 语义分割 定义&#xff1a;【只判断类别&#xff0c;无法区分个体】 语义分…

Matlab实现麻雀优化算法优化回声状态网络模型 (SSA-ESN)(附源码)

目录 1.内容介绍 2.部分代码 3.实验结果 4.内容获取 1内容介绍 麻雀搜索算法&#xff08;Sparrow Search Algorithm, SSA&#xff09;是一种新兴的群体智能优化算法&#xff0c;灵感来源于麻雀的觅食行为及其在面临危险时的预警机制。SSA通过模拟麻雀的这些自然行为来寻找问题…

[Docker学习笔记]利用Dockerfile创建镜像

Dockerfile 指令 指令作用from继承基础镜像maintainer镜像制作者信息(可缺省)run用来执行shell命令expose暴露端口号cmd启动容器默认执行的命令entrypoint启动容器真正执行的命令volume创建挂载点env配置环境变量add复制文件到容器copy复制文件到容器workdir设置容器的工作目录…

蓝卓亮相中国工博会,打造以数据驱动的智能工厂

9月28日&#xff0c;以“工业聚能&#xff0c;新质领航”为主题的第24届中国国际工业博览会&#xff08;以下简称“工博会”&#xff09;在国家会展中心&#xff08;上海&#xff09;圆满拉下帷幕。本届工博会共设9大专业展区&#xff0c;吸引了来自全球28个国家和地区的2600余…

针对考研的C语言学习(定制化快速掌握重点4)

typedef的使用 简化变量类型 逻辑结构 集合结构&#xff1a;无关系 线性结构&#xff1a;一对一 树形结构&#xff1a;一对多 图形结构&#xff1a;多对多 存储结构 顺序存储和链式存储&#xff08;考代码&#xff09; 顺序存储优点&#xff1a;1.可以实现随机存取。2.…

针对考研的C语言学习(定制化快速掌握重点5)

顺序表 特点&#xff1a; 写代码主要就是增删改查&#xff01;&#xff01;&#xff01; 写代码的边界性非常重要以及考研插入和删除的位置都是从1开始&#xff0c;而数组下标是从0开始 【注】下标和位置的关系 线性表最重要的是插入和删除会涉及边界问题以及判断是否合法 …

【Spring Boot 入门二】Spring Boot中的配置文件 - 掌控你的应用设置

一、引言 在上一篇文章中&#xff0c;我们开启了Spring Boot的入门之旅&#xff0c;成功构建了第一个Spring Boot应用。我们从环境搭建开始&#xff0c;详细介绍了JDK的安装以及IDE的选择与配置&#xff0c;然后利用Spring Initializr创建了项目&#xff0c;分析了项目结构&am…

资质申请中常见的错误有哪些?

在申请建筑资质的过程中&#xff0c;企业可能会犯一些常见的错误&#xff0c;以下是一些需要避免的错误&#xff1a; 1. 资料准备不充分&#xff1a; 申请资质需要提交大量的资料&#xff0c;包括企业法人资料、财务报表、业绩证明等。资料不齐全或不准确都可能导致申请失败。…

多线程(一):线程的基本特点线程安全问题ThreadRunnable

目录 1、线程的引入 2、什么是线程 3、线程的基本特点 4、线程安全问题 5、创建线程 5.1 继承Thread类&#xff0c;重写run 5.1.1 创建Thread类对象 5.1.2 重写run方法 5.1.3 start方法创建线程 5.1.4 抢占式执行 5.2 实现Runnable&#xff0c;重写run【解耦合】★…

MySQL-数据库设计

1.范式 数据库的范式是⼀组规则。在设计关系数据库时&#xff0c;遵从不同的规范要求&#xff0c;设计出合理的关系型数 据库&#xff0c;这些不同的规范要求被称为不同的范式。 关系数据库有六种范式&#xff1a;第⼀范式&#xff08;1NF&#xff09;、第⼆范式&#xff08;…

【Mysql】SQL语言基础

1、SQL的概述 SQL全称&#xff1a;Structured Query Language,是结构化查询语言&#xff0c;用于访问和处理数据库的标准的计算机语言。SQL语言1974年由Boyce和Chamberlin提出&#xff0c;并首先在IBM公司研制的关系数据库系统systemr上实现。 美国国家标准局&#x…