Android NDK开发1般有下列步骤:
一) JNI接口设计;
二) 使用C/C++实现本地法子;
三) 天生动态链接库;
四) 将动态链接库复制到Java工程,天生.apk文件。
首先,创立1个NDK工程,然后在这个文件夹下树立jni以及src两个目录,jni用来寄存咱们的C文件,src是调用C库的Java接口文件。接着创立jni/SerialPort.c,该文件的主要作用是完成串口的打开以及封锁。
JNIEXPORT jobject JNICALL Java_android_serialport_SerialPort_open(JNIEnv *env, jobject thiz, jstring path, jint baudrate) {
……
/* Opening device */
const char *path_utf = (*env)-GetStringUTFChars(env, path, &iscopy);
LOGD("Opening serial port %s", path_utf);
fd = open(path_utf, O_RDWR | O_DIRECT | O_SYNC);
LOGD("open() fd = %d", fd);
(*env)-ReleaseStringUTFChars(env, path, path_utf);
……
/* Configure device */
……
struct termios cfg;
cfmakeraw(&cfg);
cfsetispeed(&cfg, speed);
cfsetospeed(&cfg, speed);
}
在文件中,函数名这样定义:
jobject JNICALL Java_android_serialport_SerialPort_open,这个是JNI的尺度,定义需要依照以下格局:Java_packagename_classname_methodname
接着创立文件jni/Android.mk.这个文件是咱们本地c代码的Makefile。文件内容 LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE:= serial_port
LOCAL_SRC_FILES := SerialPort.c
LOCAL_LDLIBS:= -llog
include $(BUILD_SHARED_LIBRARY)
LOCAL_PATH:=$(callmy-dir)这句用来指定编译的路径通过调用宏my-dir获患上到当前工作的路径。
include$(CLEAR_VARS) CLEAR_VARS这个变量是编译系统提供的用来指明1个GNU makefile文件添加这句主要的目的是清算所有的LOCAL_XXX,好比LOCAL_MODULE、LOCAL_SRC_FILES等。在每一个新模块的开始处需要添加这句。
LOCAL_MODULE := serial_port这句定义了模块名称,将来编译的库或者者可履行程序就以此命名。假设编译的是动态库或者者静态库,那么库名就是libserial_port.so或者者libserial_port.a。需要留神的是系统会在天生动态库或者者静态库的时候自动添加lib的前缀。
LOCAL_SRC_FILES := SerialPort.c是列出需要编译的源码文件名。这里不需要列出头文件以及被囊括文件,因为编译系统会自动为你添加。
include$(BUILD_SHARED_LIBRARY)这句说明将来发生的库是共享库即动态链接库。
接着,咱们便可以够在cygwin下编译天生库文件了。如图二所示,入进到工程目录下,运行ndk-build命令,天生了名为libserial_port.so的文件。
将该文件安装到工程目录下的libs“armeabi目录中。然后在src目录下编写的serialport.java文件,该文件用于JNI接口调用。关键代码
public class SerialPort {
……
/*open the serial port*/
mFd = open(device.getAbsolutePath(), baudrate);
// JNI
private native static FileDescriptor open(String path, int baudrate);
public native void close();
static {
System.loadLibrary("serial_port");
}
}
private native static FileDescriptor open(String path, int baudrate)这句申明,带有native关键字,说明该法子是本地法子。System.loadLibrary("serial_port")这句就是用来加载咱们的c动态库的。上面声明法子的详细实现就在咱们加载的库中。
在完成为了上述工作后,咱们便可以够针对于详细利用来使用串口完成数据通信了。文中通过按键搜台,并显示出详细频段。
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说工学类浅谈基于Android平台的串口通信实现(2)在线全文阅读。