当前位置:  技术问答>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 如下


#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.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 申请Android Map 的API Key(v2)的最新申请方式(SHA1密钥)
  • Android瀑布流实例 android_waterfall
  • Android开发需要的几点注意事项总结
  • Android系统自带样式 (android:theme)
  • android 4.0 托管进程介绍及优先级和回收机制
  • Android网络共享软件 Android Wifi Tether
  • mysql iis7站长之家
  • Android 图标库 Android GraphView
  • Android及andriod无线网络Wifi开发的几点注意事项
  • 轻量级Android开发工具 Android Tools
  • Android 2.3 下StrictMode介绍
  • Android 开发环境 Android Studio
  • IDEA的Android开发插件 idea-android
  • Android手机事件提醒 Android Notifier
  • XBMC的Android客户端 android-xbmcremote
  • Android小游戏 Android Shapes
  • Android电池监控 Android Battery Dog
  • android开发:“android:WindowTitle”没有对应项no resource
  • Android 上类似IOS 的开关控件。 Android ToggleButton
  • Android 将 android view 的位置设为右下角的解决方法
  • Android 2D游戏引擎 Android Angle


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,