首页天道酬勤plc只读和写入的区别,nandflash读写错误

plc只读和写入的区别,nandflash读写错误

张世龙 05-13 00:53 32次浏览

Android端的APP要通过SPI读取和写入数据,Android必须调用C/C程序接口。 安卓系统基于Linux内核,RK3399的SPI使用介绍了Linux的基础SPI驱动程序和Linux APP应用程序测试程序的编写。 如何在Android APP应用程序中实现SPI数据读写?下面介绍了如何创建JNI文件,以及如何生成和使用. so库文件。 什么是JNI

JNI是JavaNativeInterface的缩写,它提供了几种API,主要用于实现Java与其他语言的通信(CC )。 从java1.1开始,JNI标准成为java平台的一部分,允许java代码与用其他语言编写的代码进行交互。 JNI最初是为本地编译语言,特别是c和c而设计的,但并不妨碍其他编程语言的使用。 只需调用规则支持的语言。 使用java与本地编译的代码进行交互经常会导致平台失去可移植性。 但是,它有时可以接受,有时也是必须的。 例如,使用一些较旧的库与硬件、操作系统进行交互,或提高程序性能。 JNI标准要求至少确保本地代码在任何Java虚拟机环境中运行。 (摘自百度百科)2JNI程序编制

1 - Spi0Port.c撰写1 # include2# include3# include4# include5# include6# include7# include 89 # include 1011 intfd=0; 1213 jniexportjintjnicalljava _ Android _1spiport _1API _ SPI0_ open 14 (JNI env * env,jobjectobj ) 15 (16if (FD=0 19返回- 1; 20 ) 21 else _ Android _ log _ print (Android _ log _ info,' SPi ',' openspiSucessfd=%d ',fd ); 2223返回0; 24 ) 2526//write 27 jniexportjintjnicalljava _ Android _1spiport _1API _ SPI0_ write 28 (JNI env * env,jobjectobj,) 334jbytearrayarray=(env )-new bytearray (env,mlen ); 336if(Array==null ) 37 ) 38Array=null; 39返回- 1; 40 ) 4142jbyte*body=(env )-getbytearrayelements ) env,buf,0 ); 4344jinti=0; 45无符号char 4647 for; 新字节(env,len ); 70(env )-setbytearrayregion(env,buf,0,len,buffer ); 7172返回0; 73 ) 7475//close 76 jniexportjintjnicalljava _ Android _1spiport _1API _ SPI0_ close 77 (JNI env * env,jobjectobj )

2 - Spi0Port.h文件创建1 # ifndef _ SPI0port _ h _2# define _ SPI0port _ h _ 34 # include 56 # ifdef _ cplusplus7extern 1213 jniexportjintjnicalljava _ Android _1spiport _1API _ SPI0_ write 14 (JNI env * env,jobjer jbytearraybuf 1516 jniexportjintjnicalljava _ Android _1spiport _1API _ SPI0_ read 17 (JNI env * env,jobjectobj,jbyteteed

ject obj);2122#ifdef __cplusplus23}24#endif2526#endif

3.mk文件编写

要生成.so库文件,需要编写一个.mk文件(与前面的.c和.h文件放在名为jni的文件夹中),同时在Linux开发环境中使用NDK编译(具体操作自行了解),这里以Android.mk为例。1LOCAL_PATH := $(call my-dir)2include $(CLEAR_VARS)3LOCAL_MODULE    := Spi0Port4LOCAL_SRC_FILES := Spi0Port.c5LOCAL_LDLIBS += -llog 6LOCAL_LDLIBS +=-lm7include $(BUILD_SHARED_LIBRARY)

1、LOCAL_PATH := $(call my-dir)

一个Android.mk file 首先必须定义好LOCAL_PATH 变量。它用于查找源文件。在这个例子中,宏函数‘my-dir’,由编译系统提供,用于返回当前路径(即包含Android.mk file文件的目录)。

2、include $(CLEAR_VARS)

CLEAR_VARS由编译系统提供(可以在android 安装目录下的/build/core/config.mk文件看到其定义,为CLEAR_VARS:= $(BUILD_SYSTEM)/clear_vars.mk),指定让GNU

MAKEFILE为你清除许多LOCAL_XXX 变量(例如LOCAL_MODULE,LOCAL_SRC_FILES,LOCAL_STATIC_LIBRARIES, 等等...),除LOCAL_PATH ,这是必要的,因为所有的编译控制文件都在同一个GNU MAKE执行环境中,所有的变量都是全局的。

3、LOCAL_MODULE := Spi0Port

LOCAL_MODULE变量必须定义,以标识你在Android.mk文件中描述的每个模块。名称必须是唯一的,而且不包含任何空格。注意编译系统会自动产生合适的前缀和后缀,换句话说,一个被命名为‘Spi0Port’的共享库模块,将会生成“libSpi0Port.so”文件(也可以直接使用libSpi0Port命名好)。

4、LOCAL_SRC_FILES := Spi0Port.c

LOCAL_SRC_FILES变量必须包含将要编译打包进模块中的C或C++源代码文件。注意,你不用在这里列出头文件和包含文件,因为编译系统将会自动为你找出依赖型的文件,仅仅列出直接传递给编译器的源代码文件就可以了。

5、LOCAL_LDLIBS += -llog

6、LOCAL_LDLIBS +=-lm

编译模块时要使用的附加的链接器选项。使用“-l”前缀传递指定库的名字是有用的。LOCAL_LDLIBS := -llog表示告诉链接器生成的模块要在加载时刻链接到“/system/lib/liblog.so”。

可查看docs/STABLE-APIS.TXT获取使用NDK发行版能链接到的开放的系统库列表,这里表示生成的是动态库。

7、include $(BUILD_SHARED_LIBRARY)

会生成依赖关系,当库不存在时会去编译这个库。

这里主要介绍的是基于C的Makefile文件的编写,如果用户使用的是C++代码,Makefile文件中的变量以及宏定义就会有所不同。

(说明摘自迅为精英板使用手册V3.5-10.5节)4总结

对于Android APP操作SPI进行数据读写,需要进行3部分编写,首先Linux底层驱动编写,然后编写JNI文件,在Linux环境下利用NDK编译生成.so库文件,最后在Android APP中调用so文件。当然这只是大体的步骤,具体的还有很多细节需要去完善,比如Linux下修改SPI设备文件读、写、执行权限,当用户没有读写权限时,SPI接口也是无法访问的;还有Android APP中.so文件的如何放置、加载等。

Android APP程序以及JNI等文件分享至百度云。百度云链接

https://pan.baidu.com/s/1wE2MykRGCSl7tr5BNXfbjQ

提取码:sd14

i2c转串口芯片,linux spi驱动实例 linux,fpga实现arm软核