Android 驱动Ok6410Led

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 驱动Ok6410Led)