Android 下通过jni读取i2c数据
Linux 平台:ubuntu 10.04(x86)
Android平台:AML18726-M3(Android4.0, linux kernel2.6.34)
JNI: Java Native Interface
原理:JNI允许在Java虚拟机上运行的Java代码操作其他语言编写的应用程序和本地库方法,从而能够直与接特定的操作系统和硬件平台进行交互。
方法:(这里是在linux下编译so库的方式)
一. Linux下jni编译环境搭建
1. 安装ndk.
a. 将c文件编译成so库的时候需要用到ndk-build命令,必须安装ndk
下载android-ndk-r6-linux-x86.tar,拷贝到ubuntu下,解压到/home/tony/sda6/m3tools目录
b. 添加ndk环境变量:
export PATH="$PATH:/home/tony/sda6/m3tools/android-ndk-r6"
添加完成后可以用ndk-build–v查看是否成功
二. Linux kernel 内核添加i2c设备
1. 根据原理图,i2c的mcu为i2c B, mcu芯片地址为0xa0
2. 在kernel中将设备注册到i2c B总线上,这样才能通过i2c访问到mcu上的数据。
修改kernel/inch/arch/arm/mach-meson3/board-m3-reff17.c,在i2c_board_info __initdata aml_i2c_bus_info_1[]结构体中注册设备(若是i2c A,则在i2c_bus_info_0[]中注册)
staticstruct i2c_board_info __initdata aml_i2c_bus_info_1[] = {
//elevator
{
I2C_BOARD_INFO("elevator ",0xa0),
},
};
3. 重新编译内核。
make uImage 并更新uImage.
三. Jni程序编写
1. 以电梯应用程序amlogicAD为例,在amlogicAD目录下新建jni目录
2. 编写Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := i2c_elevator //name of so
LOCAL_SRC_FILES := i2c_elevator.c //c file
LOCAL_LDLIBS := -llog
LOCAL_C_INCLUDES := $(MY_ANDROID_SOURCE)/frameworks/base/core/jni/android/graphics \
$(MY_ANDROID_SOURCE)/external/skia/include/core \
$(MY_ANDROID_SOURCE)/external/skia/include/images \
$(MY_ANDROID_SOURCE)/frameworks/base/includ