仿写android-serialport-api

前言

因为项目中需要使用android-serialport-api,来提供上层apk对开发板串口的控制。这也是我学习jni的最初目的。所以,要搞清android-serialport-api到底是怎么写出来的,我们才能够把其移植到我们已经开发好的apk之中。下面我介绍一下我仿写这个程序的步骤。

仿写android-serialport-api

第一步

经过测试和研读android-serialport-api,我们把我们需要的及格主要文件提取出来。
主要文件

第二步

因为在SerialPort.java文件中引入了JNI函数以及声明了库。

private native static FileDescriptor open(String path, int baudrate, int flags);
public native void close();
static {
    System.loadLibrary("serial_port");
}

所以,需要在工程出点击右键Android Tools->Add Native Support…
在弹出的对话框窗口中,然后把库名写为上面声明的库名serial_port。

第三步

在jni目录中,创建SerialPort.c文件。把android-serialport-api中的SerialPort.c文件复制过来。然后把两个被调用的函数的函数名按照JNI的规则重写一下。根据我的包名com.ye.uart以及调用这两个函数的文件名SerialPort.java

JNIEXPORT jobject JNICALL Java_com_ye_uart_SerialPort_open
  (JNIEnv *env, jclass thiz, jstring path, jint baudrate, jint flags);
JNIEXPORT void JNICALL Java_com_ye_uart_SerialPort_close
  (JNIEnv *env, jobject thiz);

在Android.mk中:
LOCAL_MODULE := serial_port
LOCAL_SRC_FILES := SerialPort.c

第四步

按照道理上讲这样就算已经把android-serialport-api程序仿写完了。但是,在运行的时候Android会报错,说是Application无法向下转型。其实,是因为我们的Application.java中的Application类继承了android.app.Application。所以,我们需要在Manifest文件中进行修改。在application标签的属性中,添加一个android:name=“Application”。

<application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme"
        android:name="Application" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name="ConsoleActivity" >
        </activity>
    </application>

然后成功运行!
这样就算成功的把android-serialport-api进行了移植。

关于android-serialport-api

我并未给大家分享太多关于android-serialport-api的很多东西,一方面程序并不难,另一方面有很多博客也写了这方面的东西。我就说一下我遇到的问题。程序正常运行,但是打开console界面提示:You do not have read/write permission to the serial port.但是在adb shell中获取权限(adb shell;chmod 777 /dev/ttyS*)后软件就可以正常工作。首先,需要检查你的Android系统是否已经root了,如果没有那需要把系统root。其次,可能原因在你的su命令所在的文件夹不一样。android-serialport-api程序中su命令在/system/bin文件夹下,而有些Android系统的su命令在/system/xbin文件夹下。这需要在SerialPort.java文件中修改。大家要注意。

分享

在这里我给大家分享一下我在做这个过程中获得的一些心得。
我讲这个雏形移植到我们已经写好的apk之中的时候,我发现当我对已有工程的jni进行编译的时候。我们工程之前添加的库文件(在libs文件夹中)全部消失了,只剩下我们所写的libserial_port.so库。这样导致apk调用之前库文件失败从而发生运行错误。
经过思考我发现,其实我们只要在工程中的libs文件中添加好我们生成的libserial_port.so。并不需要再进行jni相关函数的重新编译。
根据这个思路,我们编写jni函数的时候只要规划好我们需要调用函数的包名和文件名在一个测试工程中先生成好.so文件。然后,在真正的工程中只需要在libs文件夹中添加实现生成好的.so文件,再在同包名和文件名的文件下声明和调用他就可以了。
这也算是我在做这件事之中所获得的最大的收获吧。

结语

这样基本上就把我最近做的关于jni的工作都叙述清楚了。也算是对近期工作的总结。欢迎大家交流
ps.csdn的博客服务器把我搞得死去活来,这三篇文件写了好几遍,我都快放弃这种分享方式了。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值