三、app调用服务接口访问硬件
上主要代码EEPROMActivity.java
- package com.zkgd.eeprom;
- import android.app.Activity;
- import android.os.Bundle;
- import android.os.ServiceManager;
- import android.os.IIICService;
- import android.os.RemoteException;
- import android.util.Log;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- import android.widget.EditText;
- public class EEPROMActivity extends Activity implements OnClickListener{
- private final static String LOG_TAG = "com.zkgd.eeprom";
- private IIICService iicService = null;
- private EditText valueText = null;
- private Button readButton = null;
- private Button writeButton = null;
- private Button clearButton = null;
- int len = 1;
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- iicService = IIICService.Stub.asInterface(
- ServiceManager.getService("iic"));
- valueText = (EditText)findViewById(R.id.edit_value);
- readButton = (Button)findViewById(R.id.button_read);
- writeButton = (Button)findViewById(R.id.button_write);
- clearButton = (Button)findViewById(R.id.button_clear);
- readButton.setOnClickListener(this);
- writeButton.setOnClickListener(this);
- clearButton.setOnClickListener(this);
- Log.i(LOG_TAG, "Activity Created");
- }
- public void onClick(View v) {
- if(v.equals(readButton)) {
- try {
- len = 1;
- //在从设备中读取数据
- String val = iicService.getVal(0x50,len);
- valueText.setText(val);
- } catch (RemoteException e) {
- Log.e(LOG_TAG, "Remote Exception while reading value from device.");
- }
- }
- else if(v.equals(writeButton)) {
- try {
- String val = valueText.getText().toString();
- len = val.length();
- //在从设备的子地址处开始写入数据
- iicService.setVal(val,0x50,0x10,len);
- } catch (RemoteException e) {
- Log.e(LOG_TAG, "Remote Exception while writing value to device.");
- }
- }
- else if(v.equals(clearButton)) {
- String text = "";
- valueText.setText(text);
- }
- }
- }
编译命令:mmm package/app/eeprom
打包,烧写固件至开发板,启动就可以看到该应用的图标了。
小结:
整个调用流程为:app<---AIDL访问服务<---JNI本地方法实现<---HALso文件<---硬件
一个问题,这种方法改动了android原生api,毕竟是访问了硬件。如果想做通用app又想使用c/c++提高效率,直接进行NDK开发,功能编译成库文件打进app应用的工程中。
另一个问题,硬件访问会遭遇到权限问题。如果做通用app,需要设备root了,然后在代码里添加权限修改操作,例如:"chmod 777 "+getPackageCodePath(); "chmod 777 /dev/i2c-1";