Android.mk android驱动学习1-驱动开发流程( 二 )


指令执行完成后可以发现在jni目录下生成了包名加类名的头文件
/* DO NOT EDIT THIS FILE - it is machine generated */#include /* Header for class com_example_led_test_jni_led */#ifndef _Included_com_example_led_test_jni_led#define _Included_com_example_led_test_jni_led#ifdef __cplusplusextern "C" {#endif/** Class:com_example_led_test_jni_led* Method:Leds_Operation* Signature: (IZ)Ljava/lang/String;*/JNIEXPORT jstring JNICALL Java_com_example_led_1test_jni_1led_Leds_1Operation(JNIEnv *, jclass, jint, jboolean);#ifdef __cplusplus}#endif#endif
可以发现,头文件中根据.java中定义的java类接口生成了JNI接口函数,我们要实现这个接口函数 。
然后在JNI下创建.c文件

Android.mk  android驱动学习1-驱动开发流程

文章插图
在.c中,我们将头文件中的接口函数据复制过来,然后使用操作linux设备文件
//// Created by shiyu on 2019/8/17.//#include#include#include #include //导入我们创建的头文件#include "com_example_led_test_jni_led.h"#define DEVICE_NAME"/dev/leds"JNIEXPORT jstring JNICALL Java_com_example_led_JNITest_Leds_1Operation(JNIEnv *env, jclass obj, jint ledsNum, jboolean status){int leds_fd = 0;leds_fd = open(DEVICE_NAME, O_RDWR);//打开设备节点if (leds_fd == -1) {return 1;}switch (ledsNum) {case 0:if (status)ioctl(leds_fd, 0, 0);elseioctl(leds_fd, 1, 0);break;case 1:if (status)ioctl(leds_fd, 0, 1);elseioctl(leds_fd, 1, 1);break;defautl :break;}close(leds_fd);return 0;//操作成功返回0}
在jni下创建一个.mk文件
LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := jni_ledLOCAL_SRC_FILES := com_example_led_test_jni_led.cinclude $(BUILD_SHARED_LIBRARY)
这时指定了生成库的名字和源文件,再新建一个.mk文件
APP_ABI := all
安装NDK工具集后,进入jni目录使用ndk-build命令将JNI接口程序编译成库文件
在libs目录下生成了各种平台的库文件
为了让项目能够找到我们的生成的库,在build. 文件夹的下添加:
sourceSets {main() {jniLibs.srcDirs = ['../libs']jni.srcDirs = [] //屏蔽掉默认的jni编译生成过程}}
然后在.java中加载生成的库文件
package com.example.led_test;public class jni_led {static {System.loadLibrary("jni_led");//加载生成的.so文件}public native static String Leds_Operation(int ledNum, boolean status); //操作接口}
接下来我们编写应用程序利用接口控制LED灯
4.编写应用程序
打开工程目录下的.xml文件,添加4个,并指写的回调函数

我们为4个按键指定了4个回调函数据,接下来我们在.java中实现这4个回调函数
package com.example.led_test;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;import android.view.View;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);}public void led2_on_click( View view ){jni_led.Leds_Operation(0, false);}public void led2_off_click( View view ){jni_led.Leds_Operation(0, true);}public void led3_on_click( View view ){jni_led.Leds_Operation(1, false);}public void led3_off_click( View view ){jni_led.Leds_Operation(1, true);}}