This article talk about how to test device driver on JNI.

  There are two ways to test the device driver :

  (1) Create methods to control devices in .c/.cpp file, the .java call the methods in .c/.cpp :

  This way is call JNI (Java Native Interface), means java works via native interface in C/C++.

  (2) .java control devices via the class in FileInputStream and FileOutputStream.

  TIPS :

I test these two methods in eclipse ADT.
If you don't know how to write android application program, I think you'd better take some reading in books about android app design and do some practice firstly.

  Error TIPS:

If there "R cannot be resolved to a variable" error in your project when created, try "Project -> clean"

  1、JNI

  (1) Create android project

File -> New -> Android Application Project

  (2) Create jni native support

  You must get the ndk work tools already and prefix the ndk path :

Windows -> Preferences -> Android -> NDK

  Right click the project name :

Android Tools -> Add Native Support

  There will be a new directory in project :

jni ——- Andoid.mk
|—- wordcntjni.cpp

  (3) string.xml

<?xml version="1.0" encoding="utf-8"?>
<resources> <string name="app_name">wordcntjni</string>
<string name="action_settings">Settings</string>
<string name="wcstring">JNI test app.</string>
<string name="wcwrite">Write</string>
<string name="wcread">Read</string> </resources>

  (4) activity_main.xml

  Graphical Layout :

  xml :

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" > <EditText
android:id="@+id/editText_wc"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:inputType="text"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:ems="10" > <requestFocus />
</EditText> <Button
android:id="@+id/onClick_wcRead"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignRight="@+id/editText_wc"
android:layout_below="@+id/editText_wc"
android:onClick="onClick_wcRead"
android:text="@string/wcread" /> <Button
android:id="@+id/onClick_wcWrite"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/editText_wc"
android:layout_toLeftOf="@+id/onClick_wcRead"
android:onClick="onClick_wcWrite"
android:text="@string/wcwrite" /> <TextView
android:id="@+id/textView_wc"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/editText_wc"
android:layout_below="@+id/onClick_wcWrite"
android:text="@string/wcstring" /> </RelativeLayout>

  (5) MainActivity.java

package com.example.wordcntjni;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView; public class MainActivity extends Activity {
private TextView tv_wc;
private EditText et_wc; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv_wc = (TextView) findViewById(R.id.textView_wc);
et_wc = (EditText) findViewById(R.id.editText_wc);
} public void onClick_wcRead (View view) {
tv_wc.setText("Read words :" + String.valueOf(readWordCnt()));
}
public void onClick_wcWrite (View view) {
tv_wc.setText("Words write success.");
writeWordCnt(et_wc.getText().toString());
} public native int readWordCnt();
public native void writeWordCnt(String str);
static {
System.loadLibrary("wordcntjni");
} @Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
} }

  (6) wordcntjni.cpp wordcntjni.h

  Before we edit wordcntjni.cpp, we should create wordcntjni.h first :

$ pwd
~/Software/ADT/project/wordcntjni/jni $ javah -classpath ../bin/classes/ -jni -o wordcntjni.h com.example.wordcntjni.MainActivity

  Project clean the eclipse and we would find a new file wordcntjni.h in dir jni.

  Finaly, we can edit the wordcntjni.cpp :

#include <jni.h>
#include <string.h>
#include <fcntl.h>
#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h> #include "wordcntjni.h" JNIEXPORT jint JNICALL Java_com_example_wordcntjni_MainActivity_readWordCnt
(JNIEnv *env, jobject thiz)
{
int fd_dev;
int num = ;
jint wordcnt = ;
unsigned char buf[]; //fd_dev = open("/dev/wordcount2", O_RDONLY);
fd_dev = open("/data/local/jnitest.txt", O_RDONLY);
read(fd_dev, buf, ); num = ((int) buf[]) << |
((int) buf[]) << |
((int) buf[]) << |
((int) buf[]) ;
wordcnt = (jint) num; close(fd_dev); return wordcnt;
} char* jstring_to_pchar(JNIEnv* env, jstring str)
{
char* pstr = NULL; jclass clsstring = env->FindClass("java/lang/String");
jstring strencode = env->NewStringUTF("utf-8");
jmethodID mid = env->GetMethodID(clsstring, "getBytes", "(Ljava/lang/String;)[B");
jbyteArray byteArray = (jbyteArray) (env->CallObjectMethod(str, mid, strencode));
jsize size = env->GetArrayLength(byteArray);
jbyte* pbyte = env->GetByteArrayElements(byteArray, JNI_FALSE); if (size > ) {
pstr = (char*) malloc(size);
memcpy(pstr, pbyte, size);
}
return pstr;
} JNIEXPORT void JNICALL Java_com_example_wordcntjni_MainActivity_writeWordCnt
(JNIEnv *env, jobject thiz, jstring str)
{
int fd_dev; //fd_dev = open("/dev/wordcount2", O_WRONLY);
fd_dev = open("/data/local/jnitest.txt", O_WRONLY);
char* pstr = jstring_to_pchar(env, str);
if (pstr != NULL) {
write(fd_dev, pstr, strlen(pstr));
} close(fd_dev);
}

  When compilier the application, the following errors may occur :

  [ error1 ]

Android NDK: WARNING: APP_PLATFORM android- is larger than android:minSdkVersion 

  [ Fix ]

$ vim /home/linx/Software/Android/ndk/build/core/add-$ application.mk
// add the android-8 following android-14
APP_PLATFORM := android-
APP_PLATFORM := android-

  [ error2 ]

There still the read error couldn't fix yet.
The file writing is ok.
If you have any idea about this error.
I am very please to receive your reply.

  2、Java FileStream

  We don't need to create the jni files anymore by this way, just test the device in android application.

  (1) string.xml

<?xml version="1.0" encoding="utf-8"?>
<resources> <string name="app_name">file_test</string>
<string name="action_settings">Settings</string>
<string name="hello_world">Hello, Press button to write file.</string>
<string name="wstring">Write</string>
<string name="rstring">Read</string>
</resources>

  (2) activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" > <TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" /> <Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_below="@+id/textView1"
android:layout_marginRight="14dp"
android:onClick="onClick_button2"
android:text="@string/rstring" /> <Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/button2"
android:layout_alignBottom="@+id/button2"
android:layout_toLeftOf="@+id/button2"
android:onClick="onClick_button1"
android:text="@string/wstring" /> </RelativeLayout>

  (3) MainActivity.java

package com.example.file_test;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.nio.ByteBuffer; import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.TextView; public class MainActivity extends Activity {
public TextView fstream; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
fstream = (TextView) findViewById(R.id.textView1);
} public void onClick_button1 (View view) {
writeFile("File text strings.");
fstream.setText("File write success.");
}
public void onClick_button2 (View view) {
fstream.setText("File read :" + String.valueOf(readFile()));
}
private int readFile () {
byte[] buffer = new byte[4];
int num = 0;
try { FileInputStream fis = new FileInputStream("/data/local/jnitest.txt");
//FileInputStream fis = new FileInputStream("/dev/wordcount2");
fis.read(buffer);
ByteBuffer bbuf = ByteBuffer.wrap(buffer);
num = bbuf.getInt(); // num = (int)((buffer[0]) & 0xff) << 24 |
// (int)((buffer[1]) & 0xff) << 16 |
// (int)((buffer[2]) & 0xff) << 8 |
// (int)((buffer[3]) & 0xff) ; fis.close();
} catch (Exception e) {
}
return num;
} private void writeFile (String str) {
try {
FileOutputStream fos = new FileOutputStream("/data/local/jnitest.txt");
//FileOutputStream fos = new FileOutputStream("/dev/wordcount2");
fos.write(str.getBytes("iso-8859-1"));
fos.close();
} catch (Exception e) {
}
} @Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
} }

  [error]

This file does't fix the read error too, and the write is also ok.
If you have any idea about this error.
I am very please to receive your reply.

  

ok6410 android driver(7)的更多相关文章

  1. ok6410 android driver(5)

    Test the android driver by JNI (Java Native Interface), In the third article, we know how to compile ...

  2. ok6410 android driver(11)

    This essay, I go to a deeply studying to android HAL device driver program. According to the android ...

  3. ok6410 android driver(9)

    In this essay, I will write the JNI to test our leds device. If you don't know how to create a jni p ...

  4. ok6410 android driver(8)

    In the past, we know how to create and run a simple character device driver on pc, goldfish and ok64 ...

  5. ok6410 android driver(3)

    This article discusses the Makefile and how to port the module to different platform (localhost and ...

  6. ok6410 android driver(12)

    In this essay, I will talk about how to write the service libraries. TIPS : I won't discuss the name ...

  7. ok6410 android driver(10)

    From this essay, we go to a new discussion "Android Hardware Abstraction Layer". In this e ...

  8. ok6410 android driver(6)

    This is a short essay about the mistakes in compiling ok6410 android-2.3 source codes. If there is n ...

  9. ok6410 android driver(1)

    target system : Android (OK6410) host system : Debian Wheezy AMD64 1.Set up android system in ok6410 ...

随机推荐

  1. Scala 深入浅出实战经典 第77讲:模式匹配下的提取器动手构造实战

    王家林亲授<DT大数据梦工厂>大数据实战视频 Scala 深入浅出实战经典(1-87讲)完整视频.PPT.代码下载:百度云盘:http://pan.baidu.com/s/1c0noOt6 ...

  2. phpStorm无法使用svn1.8的解决办法

    1.安装SVN的Command Lines Tools. 2.在phpStorm的SVN属性中,将Use Command Line Client填入:C:\Program Files\Tortoise ...

  3. webpack处理非模块化的几方法

    webpack处理非模块化文件有几方法,主要分为外链和webpack打包二种情况: 一.使用CDN外部链接的方法 官网文档External: https://webpack.github.io/doc ...

  4. BW:如何加载和生成自定义的层次结构,在不使用平面文件的SAP业务信息仓库

    介绍 通常情况下,报告需要在一个类似树的结构来显示数据.通过启用此特性在SAP BW层次结构.高级数据显示的层次结构的顶层节点.更详细的数据可以向下钻取到的层次结构中的下级节点的可视化. 考虑一个例子 ...

  5. wordpress自动批量定时发布插件 DX-auto-publish

    DX-auto-publish是一款wordpress自动发布插件,方便实用. 该wordpress插件的主要功能如下: 1.能够自动批量定时发布wordpress站点的草稿文章,无需每篇文章都手动设 ...

  6. 【译】Python Lex Yacc手册

    本文是PLY (Python Lex-Yacc)的中文翻译版.转载请注明出处.这里有更好的阅读体验. 如果你从事编译器或解析器的开发工作,你可能对lex和yacc不会陌生,PLY是David Beaz ...

  7. 配置Tomcat的访问日志格式化输出

    博客搬家,本文新地址:http://www.zicheng.net/article/9   本文描述如何配置tomcat的访问日志,按我们的要求输出指定的日志格式. 且在Nginx+Tomcat的配置 ...

  8. 聊聊并发(七)——Java中的阻塞队列

    3. 阻塞队列的实现原理 聊聊并发(七)--Java中的阻塞队列 作者 方腾飞 发布于 2013年12月18日 | ArchSummit全球架构师峰会(北京站)2016年12月02-03日举办,了解更 ...

  9. java 流

    http://www.iteye.com/magazines/132-Java-NIO http://liyuanning.blog.163.com/blog/static/4573228620101 ...

  10. vs2010 rdlc .net4.0 卸载 Appdomain 时出错。 (异常来自 HRESULT:0x80131015) 解决办法

    网上一看Appdomain出错,绝大部分都是说控件加载错误.经测试在.net 4.0环境下 rdlc报表很容易发生卸载 Appdomain 时出错. (异常来自 HRESULT:0x80131015) ...