前言:前段時間接手了公司幾個智能控制的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的時候如果後面還需添加數據而不是覆蓋數據就因該在後面加true
fos = 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
查看到的方法名和當前的包名一定要相同。