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. JS错误 theForm.submit();SCRIPT3: 找不到成员。

    最近发现一个问题 当我点击 gridview中 “修改” 按钮时 会出现如下错误. 通过一系列的排查,也没有发现什么错误..后来发现在页面中 有一个按钮 的id为submit . 于是更改这个 but ...

  2. java项目中读取properties文件

    这里的配置文件都放在src下面, System.properties的内容 exceptionMapping=exceptionMapping.properties config=config.pro ...

  3. Modbus通讯协议学习 - 串口调试

    概述 我们在做任何事情之前都需要获取很多 调试步骤: 1:485转换器连接硬件 2:485转换器上的USB接口连接电脑. 3:打开设备管理器 ->查看端口 4:打开串口调试工具,在串口配置的地方 ...

  4. 利用cmdline和gradle快速编译出apk

    http://blog.csdn.net/qq_16628781/article/details/49365139 gradlew.bat clean build --info > bugtag ...

  5. Entityframework修改某个字段

    public void ChangePassword(int userId, string password) { var user = new User() { Id = userId, Passw ...

  6. A20(Cubieboard2)启动过程浅析

    A20支持从NAND Flash.SPI NOR Flash.SD card(SDC 0/2)和USB启动.当系统上电时,首先检测Boot Select Pin(BSP)管脚,如果为低电平,则直接从U ...

  7. VC中使用ATL库实现正则表达式匹配(ADODB::Error)

    1. 确保项目属性中ATL使用处于打开状态. 如VS中项目属性常规—ATL使用—静态链接到ATL 2. 在使用时加上头文件 #include "atlrx.h" 3. 使用示例代码 ...

  8. [转]LINQ之路系列博客导航

    分享一个学习Linq的好博客:Linq之路

  9. JAVA 汇编语言查看

    http://blog.csdn.net/bingduanlbd/article/details/8524300 http://hllvm.group.iteye.com/group/topic/34 ...

  10. EPLAN P8导线颜色的设置

    P8里的导线应称为"连接",连接的颜色代表了其电位的传递路径,如可以给三相电源设置成黑色,PE设为绿色,N设为蓝色等等.  P8中电位在连接和元器件中传递的方法是由元器件的连接点属 ...