Android(安卓)驱动Ok6410Led
16lz
2022-05-11
12月份初,刚找到一家初创公司做Android的app应用开发,有涉及到Linux驱动方面的知识,刚好之前也有这方面接触,也买了一块Ok6410的板子,能跑2.3版本的Android。。。。就想开始搞点事,上网发现Google推出的Android Studio对NDK的支持更加方便,突然发现了光明的未来
注意:
我直接使用Jni调用HAL层,虽然可行,但是不符合Android的结构要求
环境:
1.Ok6410板子一块,自己刷好Android2.3系统
2.安装好Android Studio2.2以上的版本
3.下载ok6410Linux或者Android的源码包
关于cmake可以参考http://www.jianshu.com/p/c0ec29da278b的,很基础,很详细
ok6410的默认烧好的Android系统,已经为我们直接加载好led.so驱动文件到/dev下,我们只要最直接最这个文件进行操作就可以
java程序
public class Led { static { System.loadLibrary("LED"); } public native boolean initLed(); public native boolean openLed(); public native boolean closeLed();}
jni
#include #include #include #include #define LogE(buf) __android_log_print(ANDROID_LOG_ERROR, "ledLog", buf)//TODO 查看并且打开/dev下的驱动进行控制,应该就可以了extern "C" { int fd; JNIEXPORT jboolean JNICALL Java_com_example_administrator_ok6410ledcmake_Led_initLed(JNIEnv *env, jobject instance) { fd = open("/dev/leds", 0); return fd != -1 ? true : false; } JNIEXPORT jboolean JNICALL Java_com_example_administrator_ok6410ledcmake_Led_openLed(JNIEnv *env, jobject instance) { LogE("led"); //ioctl与驱动有关系 //fd:设备操作符 // 一般是驱动层的ioctl决定后面几个参数 //操作的数据 //编号 int value = ioctl(fd, 0, 0); return value != -1 ? true : false; } JNIEXPORT jboolean JNICALL Java_com_example_administrator_ok6410ledcmake_Led_closeLed(JNIEnv *env, jobject instance) { LogE("led"); int value = ioctl(fd, 1, 0); return value != -1 ? true : false; }}
cmke编写
cmake_minimum_required(VERSION 3.4.1)#cmake版本add_library( LED #生成一个LED的动态库 SHARED #SHARED是动态的,STATIC是静态的 src/main/cpp/led.cpp #c/c++位置 )find_library( # Sets the name of the path variable. log-lib log )target_link_libraries( # Specifies the target library.链接库,给hello连接log库 LED # Links the target library to the log library # included in the NDK. ${log-lib} )
我这边直接用ToggleButton控制led灯点亮与关闭
public class MainActivity extends AppCompatActivity { Led led = new Led(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView tv = (TextView) findViewById(R.id.sample_text); ToggleButton tb = (ToggleButton) findViewById(R.id.toggleButton); led.initLed();//记得先初加载led的驱动 tb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton compoundButton, boolean b) { if(b){ led.openLed(); }else{ led.closeLed(); } } }); }}
更多相关文章
- android camera 各版本差异
- Myeclipse 安装时候android adt, android sdk常见问题
- Perl登陆Android
- Mono for Android(安卓)4.2初探
- Android软硬整合技术(HAL&Framework)
- android-【机型-版本-分辨率】测试点罗列
- 在Ubuntu上为Android增加硬件抽象层(HAL)模块访问Linux内核驱动程
- Android不兼容和版本混乱现象严重
- Android的系统架构