前言:前段时间接手了公司几个智能控制的APP的开发工作。在开发的过程中遇到了许多的关于App的问题-架构,代码逻辑,填了许多坑(当然有人把我拉出来啦!)。为了避免再次爬坑并记录工作,写下此博客。
主要设备:410c的开发板,外接的红外模块。
APP的主要功能:一个是控制模块,一个是学习模块,以及可能要有的远程控制模块。
控制模块:主要是往底层节点写一些红外特征码,主要是一些些如夫人操作:
public static void WriteData(String path, String content) {FileOutputStream fos = null;File file = new File(path);if (file.exists()) {try {//注意new FileOutputStream的时候如果后面还需添加数据而不是覆盖数据就因该在后面加truefos = new FileOutputStream(file);Log.e("File", "FileWriter");} catch (FileNotFoundException e) {e.printStackTrace();}byte[] array = content.getBytes();try {fos.write(array);} catch (IOException e) {e.printStackTrace();}try {fos.flush();fos.close();} catch (IOException e) {e.printStackTrace();}}}
关于本Demo的第二个难点就是学习模块:
这个功能的实现主要是在C里实现的,我们主要是调用下JNI的方法进行读取已学习到的红外特征码。
关于不是自己打包的SO文件特别要强调一句:“注意JNI方法的包名要和调用JNI的报名一致!”不然会有各种调不到方法的错误。
这是我的JNI的Load文佳的path:/SmartRemoteController/app/src/main/java/com/ircode
package com.etek.ircore;import android.util.Log;import com.ircode.IRCode;/*** Created by root on 17-7-19.*/public class RemoteCore {private static final String libSoName = "IRCore";static {try {System.loadLibrary(libSoName);Log.e("JNI",libSoName+" load finished");}catch (Exception e){Log.e("JNI"," exception "+e.getMessage());}}public native static IRCode ET4007Learn(byte[] codes);public native static byte[] readLearnIRCode();public native static int IRinit();
}
如何查看SO提供的方法接口? 在Ubuntu下可以使用如下命令 nm -D XX.so
查看到的方法名和当前的包名一定要相同。