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();                }            }        });    }}













更多相关文章

  1. android camera 各版本差异
  2. Myeclipse 安装时候android adt, android sdk常见问题
  3. Perl登陆Android
  4. Mono for Android(安卓)4.2初探
  5. Android软硬整合技术(HAL&Framework)
  6. android-【机型-版本-分辨率】测试点罗列
  7. 在Ubuntu上为Android增加硬件抽象层(HAL)模块访问Linux内核驱动程
  8. Android不兼容和版本混乱现象严重
  9. Android的系统架构

随机推荐

  1. Android(安卓)WebDAV 客户端实现
  2. android源码项目
  3. Android优秀开源项目汇总
  4. 简单学习下Android(安卓)Activity
  5. 闲来无事,分析一下淘宝千牛客户端
  6. Android ListView的addHeaderView注意事
  7. widget 常用UI控件介绍
  8. android中Uri.parse()用法
  9. Android常用布局颜色值大全
  10. android:自定义长按/长点击事件