当前位置: 技术问答>linux和unix
開發Android Driver (with JNI)
来源: 互联网 发布时间:2017-04-03
本文导语: 請問, 我正在使用Ubuntu10.04 + Eclipse開發 Android Driver (with JNI) 我原本就已經有一隻 Linux Driver 如下 #include #include #include #include #include #include #include #include #include #include #include MODULE_LICENSE("Dual B...
請問,
我正在使用Ubuntu10.04 + Eclipse開發 Android Driver (with JNI)
我原本就已經有一隻 Linux Driver 如下
其Makefile如下
我在Ubuntu Terminal下測試該Driver是可以正常運作的 (make-->insmod-->測試)
現在我想要將該 Driver整合到現在正在開發的Android虛擬機上(使用eclipse)
請問該怎麼作?
我現在Andriod程式內容如下
JAVA Code:
JNI Code
不過在
的地方傳回的是 -1
errno 是 2 (No such file or directory)
我個人理解是因為虛擬器並部包含我的driver
請問接下來應該怎麼作呢?
謝謝大家的幫忙
我正在使用Ubuntu10.04 + Eclipse開發 Android Driver (with JNI)
我原本就已經有一隻 Linux Driver 如下
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
MODULE_LICENSE("Dual BSD/GPL");
#define IOC_MAGIC 'd'
#define IOCTL_HELLO_ON _IOWR(IOC_MAGIC, 1, unsigned char)
#define DRIVER_NAME "hellodev"
int HELLO_ON(unsigned char * arg);
static int hellodev_devs = 1;
static unsigned int hellodev_major = 0;
static int hellodev_minor = 0;
static struct cdev hellodev_cdev;
static struct class *hellodev_class = NULL;
static dev_t hellodev_dev;
int HELLO_ON(unsigned char * arg)
{
int retval = 0;
unsigned char data;
if (copy_from_user(&data, (int __user *) arg, sizeof(data))) {
retval = -EFAULT;
goto done;
}
printk(KERN_ALERT "HELLO_ONn");
done:
return (retval);
}
static int hellodev_open(struct inode *inode, struct file *file)
{
printk(KERN_ALERT "hellodev_openn");
return 0;
}
static int hellodev_close(struct inode *inode, struct file *file)
{
printk(KERN_ALERT "hellodev_closen");
return 0;
}
int hellodev_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg)
{
int retval = 0;
switch (cmd)
{
case IOCTL_HELLO_ON:
if (!access_ok(VERIFY_WRITE, (void __user *)arg, _IOC_SIZE(cmd))) {
retval = -EFAULT;
goto done;
}
HELLO_ON((unsigned char *)arg);
break;
default:
retval = -ENOTTY;
break;
}
done:
return (retval);
}
struct file_operations hellodev_fops = {
.owner = THIS_MODULE,
.open = hellodev_open,
.release = hellodev_close,
.ioctl = hellodev_ioctl,
};
static int hellodev_init(void)
{
dev_t dev = MKDEV(hellodev_major, 0);
int major;
int alloc_ret = 0;
int cdev_err = 0;
alloc_ret = alloc_chrdev_region(&dev, 0, hellodev_devs, DRIVER_NAME);
if (alloc_ret)
goto error;
hellodev_major = major = MAJOR(dev);
cdev_init(&hellodev_cdev, &hellodev_fops);
hellodev_cdev.owner = THIS_MODULE;
cdev_err = cdev_add(&hellodev_cdev, MKDEV(hellodev_major, hellodev_minor), hellodev_devs);
if (cdev_err)
goto error;
hellodev_class = class_create(THIS_MODULE, DRIVER_NAME);
if (IS_ERR(hellodev_class)) {
goto error;
}
hellodev_dev = MKDEV(hellodev_major, hellodev_minor);
device_create(hellodev_class, NULL, hellodev_dev, NULL, DRIVER_NAME);
printk(KERN_ALERT "hellodev_initn");
return 0;
error:
if (cdev_err == 0)
cdev_del(&hellodev_cdev);
if (alloc_ret == 0)
unregister_chrdev_region(dev, hellodev_devs);
return -1;
}
static void hellodev_exit(void)
{
dev_t dev = MKDEV(hellodev_major, 0);
device_destroy(hellodev_class, hellodev_dev);
class_destroy(hellodev_class);
cdev_del(&hellodev_cdev);
unregister_chrdev_region(dev, hellodev_devs);
printk(KERN_ALERT "hellodev_exitn");
}
module_init(hellodev_init);
module_exit(hellodev_exit);
其Makefile如下
EXTRA_CFLAGS += -Wall
CFILES = hellodev.c
obj-m += hellodev.o
sample-objs := $(CFILES:.c=.o)
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
我在Ubuntu Terminal下測試該Driver是可以正常運作的 (make-->insmod-->測試)
現在我想要將該 Driver整合到現在正在開發的Android虛擬機上(使用eclipse)
請問該怎麼作?
我現在Andriod程式內容如下
JAVA Code:
package com.example.helloworld;
import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import android.util.Log;
public class MainActivity extends Activity {
Context mContext = null;
public static final int ON = 0x11;
static {
System.loadLibrary("helloworld");
}
public native String printJNI(String inputStr);
public native int Init();
public native int IOCTL(int controlcode);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mContext = this;
Button bt = (Button)findViewById(R.id.button1);
bt.setOnClickListener(new MyButtonListener());
Init();
}
class MyButtonListener implements OnClickListener{
public void onClick(View v) {
if(v.getId() == R.id.button1 ){
IOCTL(ON);
String str = printJNI("Hello JNI World");
Toast.makeText(mContext, str, Toast.LENGTH_SHORT).show();
}
}
}
}
JNI Code
#include
#include
#include
#include
#define LOG_TAG "libhelloworld"
#define DEVFILE "/dev/hellodev"
#define ON 0x11
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
jstring Java_com_example_helloworld_MainActivity_printJNI(JNIEnv *env, jobject obj,jstring inputStr)
{
const char *str = (const char *)(*env)->GetStringUTFChars(env, inputStr, JNI_FALSE);
LOGD("%s", str);
jstring jstr = (*env)->NewStringUTF(env, str);
(*env)->ReleaseStringUTFChars(env, inputStr, (const char *)str);
return jstr;
}
jint Java_com_example_helloworld_MainActivity_Init( JNIEnv* env )
{
LOGD("Init()");
int fd;
fd = open(DEVFILE, O_RDWR);
LOGD("fd = %d/n",fd);
if(fd == -1)
{
LOGD("errno=%dn",errno);
return 0;
}
else
{
return 1;
}
return 1;
}
jint Java_com_example_helloworld_MainActivity_IOCTL( JNIEnv* env, jobject thiz, jint controlcode )
{
int CTLCODE = controlcode;
LOGD("IOCTL() = %x",CTLCODE);
int fd;
switch(CTLCODE)
{
case ON:
{
LOGD("IOCTL(ON)");
ioctl(fd,ON);
break;
}
default:break;
}
return 1;
}
jint JNI_OnLoad(JavaVM* vm, void* reserved)
{
void *venv;
if ((*vm)->GetEnv(vm, (void**)&venv, JNI_VERSION_1_4) != JNI_OK) {
return -1;
}
return JNI_VERSION_1_4;
}
不過在
fd = open(DEVFILE, O_RDWR);
的地方傳回的是 -1
errno 是 2 (No such file or directory)
我個人理解是因為虛擬器並部包含我的driver
請問接下來應該怎麼作呢?
謝謝大家的幫忙
|
我说下我知道的哈,我就说下你指的这个网站吧,那个上边的说的内核源代码中的drivers目录,这都是内核模块编译的知识,如果要测试驱动,我觉得不要android,先把linux内核启动起来,insmod你的模块,编写一个linux下应用程序测试你的驱动无误后,再去用涉及JNI的东西。
如果非要在这个android下测试:
1,找到android对应版本的内核代码
2,将这个驱动编译这个内核模块
3,。。。。
你最好说下你的程度,和你的开发板型号。这样也好对症下药(因为看你给的网站,你好像内核模块还不会编译)。我不清楚能要能到哪种程度,这次测试要做到哪种程度。
|
驱动模块要么编译进内核,要么也用insmod。还有要root一下,你这个driver应该在开发板上吧?
说得不对望见谅,那就算友情帮顶!
说得不对望见谅,那就算友情帮顶!
|
Andriod需要adb工具,这样使用shell和安装驱动都可以,可以搜索一下
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。