ok6410 android driver(7)
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)的更多相关文章
- ok6410 android driver(5)
Test the android driver by JNI (Java Native Interface), In the third article, we know how to compile ...
- ok6410 android driver(11)
This essay, I go to a deeply studying to android HAL device driver program. According to the android ...
- 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 ...
- ok6410 android driver(8)
In the past, we know how to create and run a simple character device driver on pc, goldfish and ok64 ...
- ok6410 android driver(3)
This article discusses the Makefile and how to port the module to different platform (localhost and ...
- ok6410 android driver(12)
In this essay, I will talk about how to write the service libraries. TIPS : I won't discuss the name ...
- ok6410 android driver(10)
From this essay, we go to a new discussion "Android Hardware Abstraction Layer". In this e ...
- ok6410 android driver(6)
This is a short essay about the mistakes in compiling ok6410 android-2.3 source codes. If there is n ...
- ok6410 android driver(1)
target system : Android (OK6410) host system : Debian Wheezy AMD64 1.Set up android system in ok6410 ...
随机推荐
- RTP-RTCP-RTSP协议的区别与联系
一.产生的背景 随着互连网的发展,人们已经不满足于传统的HTTP,FTP和电子邮件等文本信息和服务,而对内容丰富多彩的多媒体信息,服务以及多媒体通信方式提出了需求,包括声音,图象,图形,视频信息等等, ...
- Android开发之蓝牙 --修改本机蓝牙设备的可见性,并扫描周围可用的蓝牙设备
一. 修改本机蓝牙设备的可见性 二. 扫描周围可用的蓝牙设备 一. 清单文件AdroidManifest.xml: <uses-permission android:name="an ...
- BZOJ 2648: SJY摆棋子 kdtree
2648: SJY摆棋子 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=2648 Description 这天,SJY显得无聊.在家自己玩 ...
- sap 怎么导出sap的各种表
其实方法很简单,只是以前一直没用过! 进入事务码se84
- GameOver
GameOver. 正了八经的觉得GameOver了.该开始新的了.
- 《objective-c基础教程》学习笔记(十一)—— 类别
在编写面向对象程序的时候,我们经常想为现有的类添加一些新的行为.有些时候,我们可以创建这个类的子类.但是,如果我们用到工具集或者类库的时候,无法处理新建的子类.这时,Objective-C就给我们提供 ...
- MyEclipse设置编码方式
1.windows->Preferences……打开"首选项"对话框,左侧导航树,导航到general->Workspace, 右侧Text file encoding ...
- [原创]自定义控件之AndroidSegmentControlView,仿IOS平台UISegmentControlView,继承自View
版权声明:本文为博主原创文章,转载请注明出处. 控件简介 UISegmentControl在IOS平台的App中非常常见,其控件如下图所示: 这种控件的主要作用是动态的更改界面的显示内容,一般应用于内 ...
- 解决企业In-House安装APP需HTTPS支持的问题(转载)
同事写的一篇文章,感觉不错,转过来. 解决企业In-House安装APP需HTTPS支持的问题 问题背景: 能否通过应用服务器发布企业应用: 解决iOS7.1后,发布地址必须为HTTPS服务器. 写作 ...
- Node.js之绝对选择
几年前,完全放弃Asp.net,彻底脱离微软方向.Web开发,在公司团队中,一概使用Node.js.Mongodb.Git,替换Asp.net mvc.Sql server和Tfs.当时来看,这是高风 ...