admin管理员组文章数量:1794759
Android APP如何简单快速实现控制硬件设备并实现APP签名
Android APP如何简单快速实现控制硬件设备
- driver(C)层
- 硬件控制
- 节点的创建
- APP(java)层
- native(C/C++)层
- 接下来上干货,重点说说实现流程
- Android studio 中APP 实现部分
- 驱动实现部分
- 安装APP调试
- APP签名
下面展示一些 内联代码片,主要实现Java层的调用接口,文件名:
myjni.java
package com.example.awdetectapplication; public class awjni { //本方法主要实现了驱动节点的读写操作 public static native int IICWriteRead(byte[] WriteBuffer, int WriteLength,byte[] ReadBuffer, int ReadLength); //本方法主要实现了驱动节点的打开和关闭 public static native int OpenDeviceNode(); public static native int CloseDeviceNode(); static { //jni为生成.so库的名字 System.loadLibrary("jni"); } } native(C/C++)层 在本层通过C语言实现对节点的读写。下面展示一些 内联代码片,文件名: myjni.c
/* * Class: com_example_awdetectapplication_awjni * Method: IICWriteRead * Signature: ([BI[BI)I */ #include <errno.h> #include <fcntl.h> #include <malloc.h> #include <math.h> #include <stdbool.h> #include <stdio.h> #include <string.h> #include <unistd.h> #include <jni.h> #include <android/log.h> #define LOG_TAG "hello" #define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__) #define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,LOG_TAG,__VA_ARGS__) #define DEVICE_NAME "/dev/hello" static int fd = 0; int file_read(jbyte *rbuf, jint rlen) { int ret; fd = open(DEVICE_NAME,O_RDWR|O_NONBLOCK); if (fd < 0) { LOGE("jni open fail for read, fd = %d\\n",fd); } LOGE("jni open sueeessed for read, fd = %d\\n",fd); LOGE("jni read rlen=%d, bufr = %#x\\n", rlen, rbuf[0]); ret = read(fd, rbuf, rlen); if (ret < 0) { LOGE("jni read fail ret = %d\\n",ret); return ret; } LOGE("jni read successed ret = %d\\n",ret); close(fd); return ret; } int file_write(jbyte *wbuf, jint wlen) { int ret; fd = open(DEVICE_NAME,O_RDWR|O_NONBLOCK); if (fd < 0) { LOGE("jni open device fail, fd = %d\\n",fd); return -errno; } LOGE("jni write bufw=%#x\\n", wbuf[0]); LOGE("jni write wlen=%d\\n", wlen); ret = write(fd, wbuf, wlen); if (ret < 0) { LOGE("jni write fail, ret = %d\\n", ret); ret = -errno; } else if (ret != wlen) { LOGE("jni write fail,ret = %d,wlen = %d\\n",ret,wlen); ret = -EAGAIN; } else { LOGE("jni write successed ret = %d\\n",ret); } close(fd); return ret; } JNIEXPORT jint JNICALL Java_com_example_awdetectapplication_awjni_IICWriteRead (JNIEnv *env, jclass class, jbyteArray wbuf, jint Wlen, jbyteArray rbuf, jint Rlen){ int ret = 0; jbyte* bufw = (*env)->GetByteArrayElements(env,wbuf,NULL); jbyte* bufr = (*env)->GetByteArrayElements(env,rbuf,NULL); jint wlen = (*env)->GetArrayLength(env,wbuf); jint rlen = (*env)->GetArrayLength(env,rbuf); LOGE("jni first wlen=%d, rlen = %d\\n", wlen,rlen); if(wlen > 1) { file_write(bufw, wlen); } //get reg addr bufr[0] = bufw[0]; if (rlen > 0) { file_read(bufr, rlen); } return ret; } /* * Class: com_example_awdetectapplication_awjni * Method: OpenDeviceNode * Signature: () */ JNIEXPORT jint JNICALL Java_com_example_awdetectapplication_awjni_OpenDeviceNode (JNIEnv *env, jclass class){ fd = open(DEVICE_NAME,O_RDWR|O_NONBLOCK); if (fd < 0) { LOGE("jni open fail, fd = %d\\n",fd); } LOGE("jni open sueeessed, fd = %d\\n",fd); return fd; } /* * Class: com_example_awdetectapplication_awjni * Method: CloseDeviceNode * Signature: ()I */ JNIEXPORT jint JNICALL Java_com_example_awdetectapplication_awjni_CloseDeviceNode (JNIEnv *env, jclass class){ close(fd); return 0; } 接下来上干货,重点说说实现流程 Android studio 中APP 实现部分1.创建刚刚上边提到的myjni.java代码,简单的说,就是你的Java程序的最底层调用接口;
2.通过java命令生成 .h文件。这个 .h文件就是你要实现的native层代码,你必须,原封不动的对这个 .h进行CV(复制粘贴)操作,创建myjni.c文件,在该文件中实现对应的接口;
3.javah命令,是JDK中带的一个功能,主要是通过它来创建 .h文件。具体命令如下: ①进入app/src/main/java
②运行javah -jni com. exampole.myapplication.myjni(注意,这里就是之前创建的myjni.java文件的路径)
③没有错误,Java路径下会生成一个.h文件;
④在main/java/创建JN目录;
⑤在JNI目录下根据.h文件,实现对应的myjni.c,即之前的文件;
⑥在JNI目录下,实现Android.mk,具体实现如下: Android.mk
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := jni //jni 即是最终生成的库名字 LOCAL_SRC_FILES := myjni.c //即是.c源文件 LOCAL_LDLIBS += -llog include $(BUILD_SHARED_LIBRARY)⑦通过终端进入到JNI路径,进行编译: 运行 ndk-build,编译成功后,会在Java目录下生成libs目录; 关于ndk,若没有安装,在使用之前必须先安装,ndk的功能即编译工具,将.c文件编译成.so文件。
⑧在main/路径下创建jniLib目录,将将libs目录下的库全部复制到jniLib下; 好了终于,大功告成,接下来进行编译APP,直接点击Android Studio的编译按钮,编译成功即可;
驱动实现部分还有最关键一步,千万不要忘记,加载驱动,千万,千万,不然将会找不到文件节点;
①编译linux内核,将驱动编译进image;
②重新烧写系统镜像,抓取内核的log,等到驱动加载成功后,会在/dev下或者sys/bus/i2c/driver 路径下出现对应的驱动文件节点。
安装APP调试对于与你开发的APP,如果要安装到手机上,有两种方式:
第一、打开手机调试模式,直接通过USB连接手机,利用Android studio进行调试;
第二 、对你的APP进行签名,然后安装。
APP签名第一步,如图所示,依次点击: 第二步,选择APK,点击NEXT
第三步,开始注册签名,如果有签名key,则直接选择,没有的话点击Create new: 开始输入签名信:first and last name之前的项目是必填项: 点击ok后会弹出一个警告窗口,直接点击ok即可。然后回到下边界面: 第四步,点击next,选择发行版本,并勾选下边的V1,V2,V1是必须勾选的,用以生成签名文件,V2只有在APP上架应用商店时才选择,完了后点击finish。 第五步,点击如下Build,再次利用已经生成的签名文件编译APP即可。 结束后,在APP工程路径下的D:\\Android_work\\xxxx\\app\\build\\outputs\\apk\\debug目录下会生成对应的APK文件,可以直接传到手机端安装使用 Android APP的签名介绍到此结束。
版权声明:本文标题:Android APP如何简单快速实现控制硬件设备并实现APP签名 内容由林淑君副主任自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.xiehuijuan.com/baike/1686474970a71613.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论